Wiele wątków i deadlock w QT

0

Mam następujący problem

jest sobie jakiś kontener - mapa, lista, nieważne - no i próbuję się do niego "dobrać" w wątku

przed operacją ustawiam mutexa, ale to powoduje komunikat nastepującej treści

QMutex:🔒 Deadlock detected in thread 0x1468

próbowałem z tryLock -ale to wtedy tak jakoś dziwnie działało - więc zrozumiałem, że nie tędy droga

poszukałem po sieci, znalazłem, że w takich przypadkach przydają się semafory, ale tu się zaczynają schody

przykłady jakieś są - ale ja ich nie rozumiem

np
http://cartan.cas.suffolk.edu/qtdocs/threads-semaphores-semaphores-cpp.html

czemu sa tam takie a nie inne wartości - skąd mają być te wartości przy semaforach

np
QSemaphore::QSemaphore ( int n = 0 )
Creates a new semaphore and initializes the number of resources it guards to n (by default, 0).

co to są te zasoby?

jak mam np jeden kontener do które próbuję coś pisać/czytać w watkach to daje tam jeden?

mam prośbę o jakiś konkret

//np mam listę

QList<QString> lista;

//lub mapę

QMap<int, QString> mapa;

//mam metody do zapisu i odczytu

void zapisz(int klucz, Qstring wartość)
{
   mapa[klucz] = wartość;
}

Qstring odczyt(int klucz)
{
   if(mapa.contains(klucz))
     return mapa[klucz];
  return "";
}


//i co powinienem wpisać, jak powinienem zapisać te metody, aby nie było deadlocka?

z góry dziękuję za pomoc

0
QMutex mutex;

...


void zapisz(int klucz, Qstring wartość)
{
	QMutexLocker locker(&mutex);
	mapa[klucz] = wartość;
}
 
Qstring odczyt(int klucz)
{
	QMutexLocker locker(&mutex);
	
	if(mapa.contains(klucz))
		return mapa[klucz];
	return "";
}
0

dziękuję bardzo za odpowiedź

przyczyną była moja głupota - czyli błąd projektowy, logiczny, czy jak tam to zwać - poczytałem, poszukałem, posprawdzałem
potem przemyślałem rzecz raz jeszcze i jest już dobrze

1 użytkowników online, w tym zalogowanych: 0, gości: 1