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:
- 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?
- 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)?