Synchronizacja watków w kilku miejscach

0

Witam,
mam program w którym po ekranie <ort>roszaja </ort>się jakies obiekty - każdy z obiektów jest jednym wątkiem. Kiedy obiekty się spotkają to ma się cos ort!. To kiedy się spotkają sprawdzam na podstawie współrzędnych ich położenia. Współrzędne te przechowuję w globalnej tablicy, aby kazdy wątek mógł sprawdzić gdzie się znajdują pozostałe.
Fragment kodu (procedure) spotkania począwszy od sprawdzania czy jakiś wątek jest w pobliżu, aż do odpowiedniego zmodyfikowania tablicy współrzędnych po spotkaniu mam w sekcji krytycznej.
Sedno: ;)
Zastanawiam się jak rozwiązać problem, że mam kilka procedur korzystających z tej globalnej tablicy. Np. kiedy się pojawia nowy watek, to trzeba jego dane dodać do tej tablicy i fajnie by było, gdyby dostep do tej tablicy został zablokowany na tą chwilę. Podobnie jest np. kiedy jakiś watek umiera i usuwam jego dane z tablicy...
Jak to pogodzić?

W róznych kursach/książkach napisane jest, że sekcje krytyczne chronią jakieś "zasoby". Co dokładnie oznaczają "zasoby"- czy to znaczy że można jakoś bezpośrednio blokować dostep do zmiennych, czy też zawsze trzeba to zrobic przez blokowanie kodu/procedur które na nich operują..?

0

[...] czy to znaczy że można jakoś bezpośrednio blokować dostep do zmiennych, czy też zawsze trzeba to zrobic przez blokowanie kodu/procedur które na nich operują..?

W przypadku sekcji krytycznych - to drugie ;)

// w przypadku muteksów i semaforów również - Ł

0

Mhm... A może w ten sposób:
(mam nadzieję że to jest aż tak oczywiste...)

Załóżmy, że zdefiniuję sobie jedną sekcję ktyryczną np.

CS: TRTLCriticalSection;

Oczywiście gdzieś ją inicjalizuję i teraz: załóżmy że jej używam w dwóch miejscach, np:

  EnterCriticalSection(CS);
  dodajWatek;
  LeaveCriticalSection(CS);

oraz gdzieś indziej

  EnterCriticalSection(CS);
  usunWatek;
  LeaveCriticalSection(CS);

W obu procedurach (dodajWatek i usunWatek) wykonywane są operacje na owej globalnej tablicy. Pytanie [!!!] - czy te sekcje krytyczne działają w ten sposób, że jak jeden wątek zacznie wykonywać jakiś kod opatrzony sekcją krytyczną to żaden inny wątek nie wykona niczego (nawet w zupełnie innym miejscu i zupełnie inny kod) co jest zawarte w takiej samej sekcji krytycznej..? To by w zupełności rozwiązywało mój problem! :O

0

czy te sekcje krytyczne działają w ten sposób, że jak jeden wątek zacznie wykonywać jakiś kod opatrzony sekcją krytyczną to żaden inny wątek nie wykona niczego (nawet w zupełnie innym miejscu i zupełnie inny kod)

Tak, pod warunkiem, że te wątki będą używały tej samej sekcji krytycznej.

0

Mhm... Ciekawe, czy działa..? Zrobiłem tak i nie widzę żadnych problemów, więc może... Tak czy siak. Dzięki i pozdrawiam

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