Witam,

Nie mogę znaleźć żadnego ciekawego artykułu o sekcjach krytycznych. Przykłady które znalazłem są zbyt ogólnikowe. Kiedy sekcje krytyczne są restrykcyjnie wymagane? Np. mam jakąś zmienną globalną z której korzysta kilka wątków. Czy dostęp do zmiennej muszę opakować w sekcje krytyczną tylko dla wątków które chcą zmienić wartość zmiennej czy również dla tych które chcą tylko tą wartość odczytać?

Inna zagwozdka:

type
  TSessionManager = class
  private
    FLock: TRTLCriticalSection;
  public
    procedure LockManager;
    procedure UnlockManager;
  end;

var
  SessionManager: TSessionManager;
  
procedure TSessionManager.LockManager;
begin
  System.EnterCriticalSection(FSessionLock);
end;    

procedure TSessionManager.UnlockManager;
begin
  System.LeaveCriticalSection(FSessionLock);
end;  

Czy powyższy kod jest prawidłowy? W sensie, czy sekcja krytyczna musi być zmienną globalną czy może być sobie w obiekcie? Mam jakiś obiekt SessionManager i chcę aby do tego obiektu miał dostęp tylko jeden wątek jednocześnie. Czy te wątki mogą sobie wołać procedury LockManager i UnlockManager w celu zaklepania sekcji czy też już w momencie wywołania danej procedury może dojść do zakleszczenia się wątków?

Jeszcze inna zagwozdka:

procedure Test1;
begin
....
end;

procedure Test2;
begin
....
end;

procedure Test3;
begin
  Test1;
  Test2;
  .....
end;

//Watek1 zawsze wola tylko Test3:
System.EnterCriticalSection(SomeLock);  
Test3;
System.LeaveCriticalSection(SomeLock);

//Watek2 zawsze wola tylko Test2:
System.EnterCriticalSection(SomeLock);  
Test2;
System.LeaveCriticalSection(SomeLock);

Czy Watek2 musi używać sekcji krytycznej skoro żaden inny wątek bezpośrednio nie woła procedury Test2? (ale woła ją procedura Test3 wywoływana przez pierwszy wątek)

Odpowiedź na powyższe pytania rozwieje moje wszystkie wątpliwości odnośnie wątków w Delphi

Pozdrawiam