Wiele wątków i deadlock w QT

Odpowiedz Nowy wątek
taki jeden
2011-08-02 23:57
taki jeden
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::lock: 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[...]emaphores-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

Pozostało 580 znaków

2011-08-03 09:19

Rejestracja: 15 lat temu

Ostatnio: 8 godzin temu

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 "";
}

Pozostało 580 znaków

taki jeden
2011-08-03 11:33
taki jeden
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

Pozostało 580 znaków

Odpowiedz

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