QMutex - czy dobrze rozumiem?

QMutex - czy dobrze rozumiem?
tomepaw
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Lublin
  • Postów:218
0

Witam, nie wiem czy dobrze zrozumiałem pojęcie Mutexów. Otóż napisałem do testów prościutki programik składający się z MainWindow i jednego procesu.

Proces w zasadzie odlicza do 200 i wypisuje za każdym obiegiem pętli zmienną (i) poprzez qDebug(), jeżeli i==100 emituje sygnał, który odbieram w MainWindow.

I teraz jeżeli chciałbym proces zatrzymać na pewien czas, dopóki nie wykonam pewnych rzeczy w tym MainWindow powinienem użyć Mutexów?

Zamieszczam prosty kod, byłbym wdzięczny za sugestię czy dobrze zrozumiałem pojęcie Mutexów w QT, jeżeli nie to proszę o poprawienie mnie.

jakas.h: http://4programmers.net/Pastebin/1468
jakas.cpp: http://4programmers.net/Pastebin/1469
MainWindow.h: http://4programmers.net/Pastebin/1470
MainWindow.cpp: http://4programmers.net/Pastebin/1471

Po wklejeniu już kodów na koniec każdego qDebug() dodałem instrukcję flush. I w sumie wygląda na to, że mutexy działają. Tekst ze slotu w MW wypisuje się w okolicach i==100. Jednak zdarzają się przypadki, że i na samym końcu, więc jak to jest z tymi mutexami? :)

edytowany 2x, ostatnio: tomepaw
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:minuta
1

QMutex jest tu zupełnie niepotrzebny!
Zrobiłeś "klasa->moveToThread(thread);" i wykonałeś połączanie typu queued (domyślne połączenie, gdy łączone obiekty należą do innych wątków - patrz dokumentacja connect).
Efekt jest taki, że twój slot jest ZAWSZE wywoływany w głównym wątku (co jest prawidłowym i zalecanym rozwiązaniem).
Skoro jednak slot jest wywoływany zawsze z jednego wątku mutex nie ma co robić (jest zbędny).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
tomepaw
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Lublin
  • Postów:218
0

Jak zwykle konkretna odpowiedź, dzięki :)

Czyli, jeżeli dwa różne sygnały są połączone z jednym slotem, to w przypadku gdy mutex jest zablokowany drugi proces czeka aż mutex zostanie odblokowany?

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:minuta
0

NIE!
Między slotem a sygnałem masz połączenie kolejkowe (queued). Gdy emitowany jest sygnał qt opanowuje go i wysyła do innego wątku, a bieżący wątek działa dalej normalnie. Wątek główny odbiera wiadomość od sygnału za pomocą event loop i wywołuje odpowiedni slot. Masz tu wywołanie asynchroniczne.
Efekt jest taki że wszystkie operacje na main window wykonują się w głównym wątku, ergo synchronizacja/muteks jest zbędna.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.