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 이 있는데... 이놈들도 진짜 별 다른 내용이 없다.;;
'개발일지 > 아키텍트' 카테고리의 다른 글
Delphi 투게더의 Observer 패턴 소스 오류 (0) | 2012.04.19 |
---|---|
POSA2, Double-Checked Locking Optimization 패턴 (3) | 2012.04.09 |
Proactor with EPOLL, SELECT (2) | 2012.03.15 |
Delphi 에서 Leader-Follower 패턴 구현 (0) | 2012.03.14 |
FPC 에서 Leader-Follower 패턴 구현 (0) | 2012.03.09 |
댓글