본문 바로가기
개발일지/아키텍트

POSA2, Scoped Locking, Strategized Locking 패턴

by 사악신 2012. 4. 5.

POSA2 의 동기화 관련 패턴들 중 가장 기본이라고 할 수 있는 Scoped Locking 은 사실 별 거 없다. 이런걸 굳이 패턴으로 불러야하나....싶은 부류 중 하나이다. 닥치고 소스~

TGuard = class
protected
  FLock: TSynchroObject;
  FOwner: Boolean;
public
  constructor Create(ALock: TSynchroObject);
  destructor Destroy; override;

  procedure Acquire;
  procedure Release;
end;


{ TGuard }


procedure TGuard.Acquire;
begin
  if Assigned(FLock) then
  begin
    FLock.Acquire;
    FOwner := True;
  end;
end;

constructor TGuard.Create(ALock: TSynchroObject);
begin
  inherited Create;

  FLock := ALock;
  Acquire;
end;

destructor TGuard.Destroy;
begin
  Release;

  inherited;
end;

procedure TGuard.Release;
begin
  if FOwner then
  begin
    FOwner := False;
    FLock.Release;
  end;
end;

그냥 생성자에서 동기화 관련 객체를 전달 받은 후 락을 걸고~ 소멸자에서 락을 해제한다. 즉, 객체의 생성, 해제와 함께 락이 자동으로 걸렸다 풀리는 거~ 그게 전부다. 스택에 올라가는 놈이라면 그냥 생성만 해주면 끝이고, Delphi 의 경우 try ~ finally 를 사용하거나 인터페이스를 활용하면 된다. 그럼 왜 이런게 필요할까?

 

동기화시 해당 scope 에서 exit, break, continue, goto 에 따라 락을 잘 제거하여야 하고 또한 예상치 못한 예외가 발생할 경우에 대한 처리도 필요하기 때문이다.

 

즉, 객체가 생성되고 소멸되기까지의 영역이 동기화가 되는 임계 영역(Critical Section)이 되고 해당 영역을 벗어나는 행위(exit 등)를 하면 자동으로 락이 제거된다. 그냥 소스가 단순해지는 효과가 있는 것이다.^^

 

상기 소스에서 생성자에 파라미터로 전달하는 동기화 오브젝트로 TSynchroObject 를 사용하였는데, SyncObjs 유닛을 살펴보면 TCricticalSection, TMutex, TEvent 등 대부분이 이 놈을 상속받고 있다. 다형성을 이용한건데, 다형성 하면 Strategy 아니던가? 뭐, 이렇게 쓰는 걸 Strategized Locking 패턴이라고 보면 된다.(제네릭을 활용하면 좀 더 그럴듯 할 거고...);; 그 외 POSA2 에서 언급하고 있는 동기화 패턴으로 Thread-Safe Interface, Double-Checked Locking Optimization 이 있는데... 이놈들도 진짜 별 다른 내용이 없다.;;

 

반응형

댓글