wątki - synchronizacja i nie tylko...

0

witam. mam kilka pytań odnośnie wątków w c++b:
1) jeśli mam kilka wątków, które odwołują się do globalnej tablicy bądź obiektu typu np. TMemo jedynie z nich CZYTAJĄC to czy konieczna jest synchronizacja?
2) sytuacja jak powyżej tyle, że pytanie brzmi - czy w przypadku dosyć sporej ilości wątków (tak z 15) lepiej zapewnić unikalne dane dla danego wątku (kopia danych dla wszystkich wątków) czy mogą korzystać tylko z jednego egzemplarza? kontekst tego jest taki, że tych danych jest dosyć sporo (np. 6 obiektów TMemo, każdy zawiera jakieś 2000-4000 linii) a wątki wykonują żmudne, cykliczne operacje na nich (kilkaset razy nawet wracając się do jednej linii). co będzie w takim wypadku szybsze - użycie wspólnych danych czy kopia danych dla każdego wątku? (czas kopiowania danych akurat tutaj nie ma znaczenia, dane mogą być na starcie programu zainicjowane do osobnych obiektów).
z góry dzięki za sugestie, pozdrawiam

0

1)
Czytanie: Jest bezpieczne w ogólnym przypadku niemal zawsze

TMemo: Zapis jest niebezpieczny zawsze. Tylko wątek główny może to robić. Odczyt powinien być bezpieczny w zasadzie. VCL nie jest za bardzo thread-safe, ale czytać to pozwoli.

2)
Jeezu, tak to opisujesz, że się obawiam, że ty używasz komponentów walniętych na formatkę jako zmiennych globalnych. I może jeszcze Visible na false ustawiasz? No nic, po prostu - nie rób tego. Dane przechowuj po ludzku w tablicach - będzie szybciej działać i ładniej wyglądać. Jeśli tylko czytasz - IMO lepiej tablicę współdzieloną brać.

0

Jeśli twoje wątki czytają talko dane, które nie są modyfikowane przez żaden inny wątek, to spokojnie możesz nie przejmować się synchronizacją. Jeśli jednak dane się zmieniają w trakcie działania wątków pobocznych synchronizację musisz zapewnić.
Nie stosuj d tego TThread::Synchronize bo ta metoda wymusza uruchomienie podanej metody w wątku głównym (a to oznacza czekanie na zakończenie przetwarzania kolejki komunikatów w wątku głównym). Jak już musisz synchronizować to posłuż się TExclusiveWriteMutipleRead (jeśli nie przekręciłem nazwy). Zajrzyj do helpa, a na pewno będziesz wiedział jak tego użyć.

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