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

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?

  1. 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)?

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.

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.

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