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
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ć.
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ć.