Wielowatkowe odwolywanie do procedur w klasie

0

Czesc,
Mam pytanie czy takie rozwiazanie jest prawidlowe i nie niesie za soba jakiegos ryzyka.

Mam tablice, ktora przechowuje utworzone klasy (watki) majace pewne publiczne procedury (metody?;) ).

Czy dobrze kombinuje chcac odwolywac sie do nich z innych watkow aby przekazac do nich jakies wartosci? Przyklad:

tablica[i].PrzekazWartosc(jakas_zmienna) 

Czy jest mozliwosc aby wiele watkow przekazywalo w ten sposob wartosci do watku i nie spowodowalo to jakies "kolizji"?

Czy robu sie to w taki sposob czy jest inny, lepszy i optymalny?

Pozdrawiam!

0

Możesz to tak wykonać i zależy co wykonujesz w ramach PrzekazWartosc(jakas_zmienna). jeżeli jakieś ryzykowne akcje to musisz sobie tam zapewnić synchronizacje wątków.

5

Jeśli ustawiasz w ten sposób coś nieatomowego (np. stringa albo - dla x86 - 64 bitowego integera etc. etc.) to musisz dodać tam synchronizację.

0

@Patryk27, z tego co doczytałem to synchronizację robi się wątku głównym (jest to prawda?). Jeżeli tak to metode, którą opisałem da się wykorzystać w przekazywaniu w ten sposób np stringa między wątkami 'pobocznymi'?

5

źle doczytałeś - doczytałeś o synchronize, które służy do grzebania w GUI przez wątki poboczne. To o czym pisze @Patryk27 to synchronizacja pomiędzy wątkami, np. przy pomocy sekcji krytycznych czy muteksy

0

Aaaaa dzięki! Wszystko jasne w takim razie :)

0

A czy jezeli przekazywalbym tylko wskaznik na zmienna zawierajaca stringa to mimo wszystko musze zrobic synchronizacje?

Chyba, ze na mysli miales synchronizacje w samej procedurze przy 'obrabianiu' a nie samo przekazywanie wartosci przez odpalanie procedury

tablica[i].PrzekazWartosc(jakas_zmienna) 

w sekcji krytycznej.

2

Nie rozumiesz istoty problemu - miałem na myśli synchronizację w samej procedurze przy obrabianiu, aby nie doprowadzić do race condition.
Tutaj jest to ładnie opisane: http://stackoverflow.com/questions/34510/what-is-a-race-condition

0

Sory, ze tak dopytuje ale czy sekcje krytyczne rozrozniaja dostepy modyfikujace i niemodyfikujace? Jezeli nie czy istnieje takie rozwiazanie w Lazarusie?

Moglbym wiec zrobic w takiej procedurze tylko blokowanie do modyfikacji a inne watki mogloby swobodnie czytac np zmienna? (abstrakcja ale to bardziej pytanie teoretyczne).

1

Fizyka na to nie pozwala ;)

Przypuśćmy, że mamy 32-bitowy procesor, a nasza zmienna to 64-bitowy integer - potrzeba dwóch cykli pamięci (dwa assemblerowe movy) na zmianę wartości tego integera (najpierw bity 0-31, a następnie 32-63, licząc od zera - albo na odwrót, zależnie od endianness procesora).

Załóżmy, że wątek W1 zaczyna swoją pracę o czasie T+0 i jest to czas wykonywania pierwszego mova, a o czasie T+1 wykonuje drugi mov.
W tej samej chwili wątek W2 w czasie T+1 próbuje odczytać od razu wartość liczby... i mamy problem, bo odczyta liczbę zmienioną jedynie w połowie i może przez to np. podjąć błędną decyzję (jeśliby był to if) - fachowo zwie się to race condition.

Profesjonalna grafika ilustrująca problem:3fbff67eb4.png

Jak sam widzisz - dopóki trwa dostęp do pamięci (zapis/odczyt), musi być nałożona blokada na modyfikację danego obszaru (najprościej jakiś mutex, ale musisz uważać na deadlocki).

Może to mało dosadny przykład, więc możesz w razie czego sobie to rozwinąć w pamięci np. dla aktualizacji 1000-znakowego ciągu znaków ;)

0

@Patryk27 wow wielkie dzieki :) Prosciej to wytlumaczyc juz chyba sie nie dalo ;) Juz zalapalem o co chodzi :)

Dzieki!!

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