Zderzenie watkow

0

Jesli mam 1-en watek ktory wykonuje dane zadanie oraz 2-di wqatek ktory robi cos innego, to co zrobic jesli sie "zderza" ze soba, no bo moze byc taka mozliwosc.
Maja one zyc ze soba w ort!

0

Co dla Ciebie znaczy zderzą? Chodzi ci o zakleszczenie, czy o problem sekcji krytycznej??

0

noooo jedno z tych co piszesz...

0

czyli...

0

chodzi o zakleszczenie

0

synchronizuj te wątki - sekcje krytyczne, muteksy, eventy - cokolwiek.

0

Nie chce tworzyć nowego tematu więc zadam tutaj. Mam sekcje krytyczne. Uzywam ich do tego jak zmieniam wielkość dynamicznej tablicy (rekordowej) i coś do niej dodaje. Z tej procki korzysta i aplikacja i wątek. Tutaj właśnie przydaje sie sekcja krytyczna. Mam tylko pytanie, czy pomiędzy sekcją krytyczną mam umieszczać kod który nawet odczytuje coś z tej tablicy? Czy sekcje są potrzebne tylko gdy zmieniam wartość/wielkość tablicy?

0

Mam tylko pytanie, czy pomiędzy sekcją krytyczną mam umieszczać kod który nawet odczytuje coś z tej tablicy?
[...] Czy sekcje są potrzebne tylko gdy zmieniam wartość/wielkość tablicy?

No jeżeli sekcją krytyczną obejmiesz np. tylko procedury zmiany rozmiaru tablicy, a odczyt z niej nie, no to wtedy nie ma mowy o żadnej synchronizacji. Owszem, czasami są sytuacje kiedy nie trzeba synchronizować sekcjami np. odczytu (chodzi o to żeby wątek nie był blokowany), ale i tak to wymaga zastosowania jakiegoś innego mechanizmu.

0

Istnieje pojęcie operacji atomowej (czyli niepodzielnej). Takie operacje nigdy nie będą przerwane "w trakcie" przez przełączenie wątków, dlatego nie trzeba ich chronić sekcjami krytycznymi lub tp. O ile wiem należy tu odczyt z pamięci zmiennej typu integer. Co do odczytu z tablicy nie wiem, zależy czy jest wewnetrznie zrealizowany w jednym kroku (odczytaj z adrestablicy+indeks) czy też w kilku krokach (x:=adrestablicy+index, <font color="red">[tu możliwość wejścia innego wątku i namieszania w tablicy, indeksie itd]</span> odczytaj z x).

0

Mam problem z sekcjami krytycznymi. Otóż co minute wątek aktualizuje dane w dynamicznej tablicy (rekordowej). Moment kiedy korzysta z tablicy <ort>zamknęłem </ort>w:

EnterCriticalSection(CritSect);
//....
LeaveCriticalSection(CritSect);

Użytkownik ma możliwość usunięcia danego rekordu. Chce sie zabezpieczyć przed usunięciem w momencie gdy wątek akurat coś przy tablicy robi. Tak więc usuwanie też dałem pomiedzy:

EnterCriticalSection(CritSect);
//....
LeaveCriticalSection(CritSect);

Korzystam z tej samej sekcji więc powinno grać, ale tak nie jest. W momencie usuwania rekordu gdy wątek coś przy nim robi aplikacja zamarza. Pomyslałem że musze chwile odczekać aż wątek zwolni sekcje, ale aplikacja zamarza na wieczność.
Dodam że procedura kliknięcia jest w Unicie1 (button) a wątek w Unicie2. Sekcja to zmienna globalna unitu2
var
CritSect : TRTLCriticalSection;

Inicjalizacje sekcji dałem też w unicie2 na samym końcu:

initialization
  InitializeCriticalSection(CritSect);
finalization
  DeleteCriticalSection(CritSect);

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