Jak prawidłowo posługiwać się zmienną w programie wielowątkowym

Odpowiedz Nowy wątek
2011-09-16 16:46
qwerty
0

Witam,
w programie opartym o biblioteki Qt używam dwóch wątków: jeden - główny, drugi - utworzony przeze mnie.

W programie tym zamierzam użyć zmiennej typu QStringList, aby przechowywać i odczytywać pewną listę napisów. Obiekt ten dla przykładu nazwę SL.
W zamierzeniach jest: drugi wątek sięga dość często do zawartości SL(wyszukuje, czy podany napis jest zawarty w SL). Wątek główny natomiast ma za zadanie zarządzać SL, czyli odczyt zawartości i modyfikacja(dodanie lub usunięcie jednego lub wielu napisów).

Ponieważ przez większość czasu oba wątki będą wykonywały się współbieżnie muszę ustalić jakąś synchronizację dla obiektu SL, tak aby powyższe założenia mogły być bezpiecznie wykonywane.

Rozwiązania, które chce rozważyć to:
1) użycie w programie dwóch obiektów typu QStringList, przykładowo o nazwach SL1 i SL2. Wątek drugi używa zawsze SL2. Wątek pierwszy - główny - modyfikuje SL1 i wysyła zawartość SL1 poprzez sygnał np.

void wyslij(const QStringList &);

Sygnał ten odbierany jest w drugim wątku, który to przypisuje do SL2 odebrany obiekt.

Pytania:
a) czy zostanie zastosowany tzn. 'implicit sharing' dla zmiennych SL1 i SL2 w momencie przypisania SL2 = SL1;?
b) rozumiem, że jeśli zajdzie 'implicit sharing' to i tak przez chwilę w momencie modyfikacji SL1 zostanie utworzona "głęboka" kopia SL2?

2) użycie w programie jednego obiektu typu QStringList, przykładowo o nazwie SL. Wątek drugi używa SL tylko do odczytu. Natomiast wątek pierwszy - główny - modyfikuje SL. Należy użyć mechanizmów synchronizacji.

Pytania:
c) ogólne: zakładając, że SL nie będzie modyfikowane to czy dwa wątki mogą czytać tą samą zmienną współbieżnie bez żadnych dodatkowych mechanizmów synchronizacji?
d) dot. rozw. 2 - jakich konkretnie mechanizmów synchronizacji użyć dla SL w Qt? W jakich miejscach programu powinny się znaleźć (np. w miejscu odczytu, zapisu do SL)?

Nie wystarczy Ci mutex? - Endrju 2011-09-16 16:54

Pozostało 580 znaków

2011-09-16 17:03
0

Użyj QReadWriteLocka do ochrony listy.
Generalnie,jeśli program ma więcej niż 1 wątek to trzeba używać mechanizmów takich jak muteksy do każdego ze współdzielonych zasobów-innaczej się to sypnie prędzej czy później.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-09-16 17:04

Pozostało 580 znaków

2011-09-16 17:04
0

Tak jak Endrju powiedział, tak ja do tego się przychylam. Jak korzystasz z Qt to wykorzystaj wszystko i nie warto chyba kombinować a wykorzystać mutex:
http://doc.qt.nokia.com/latest/qmutexlocker.html#details

Jeśli program będzie działał wolno to potraktuj go jakimś profilerem i upewnij się gdzie jest wąskie gardło - jeśli to będzie wina mutexa to wtedy zastanawiaj się jak wykombinować by działało szybciej.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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