멀티 스레드 애플리케이션을 작성할 때 가장 중요한 것은 스레드 간의 동기화된 리소스 액세스를 제어하여 스레드의 안전한 작동을 보장하는 것입니다. Win 32 API는 이 문제를 해결하기 위해 세마포어, 뮤텍스, 중요 섹션 및 이벤트와 같은 동기화 개체 집합을 제공합니다.
Delphi는 이벤트 객체와 임계 섹션 객체를 각각 Tevent 객체와 TticalSection 객체로 캡슐화하여 이 두 객체를 간단하고 편리하게 사용할 수 있도록 합니다. 하지만 델파이 프로그램에서 세마포어나 뮤텍스 같은 객체를 사용하려면 복잡한 Win32 API 함수를 사용해야 하는데, 이는 Win32 API 함수에 익숙하지 않은 프로그래머에게는 매우 불편합니다. 따라서 저자는 Delphi를 사용하여 세마포어 및 뮤텍스 개체(각각 TSemaphore 및 TMutex)를 캡슐화하는 두 개의 클래스를 구성했으며, 이는 대부분의 Delphi 프로그래머에게 도움이 되기를 바랍니다.
1. 수업 구성
먼저 Win32 API의 세마포어 개체와 뮤텍스 개체를 추상화하고 상위 클래스 THandleObjectEx를 구성한 다음 이 상위 클래스에서 두 개의 하위 클래스 Tsemphore 및 Tmutex를 파생시킵니다.
클래스의 소스코드는 다음과 같습니다.
단위 SyncobjsEx;
인터페이스
Windows, 메시지, SysUtils, 클래스, Syncobjs를 사용합니다.
유형
THandleObjectEx = 클래스(THandleObject)
// THandleObjectEx는 상호 배제 클래스와 세마포어 클래스의 상위 클래스입니다.
보호됨
FHandle: THandle;
FLastError: 정수;
공공의
소멸자 재정의;
절차 해제;재정의;
함수 WaitFor(Timeout: DWord): TWaitResult;
속성 LastError:Integer 읽기 FLastError;
속성 핸들: THandle은 FHandle을 읽습니다.
끝;
TMutex = class(THandleObjectEx)//상호 배타적인 클래스
공공의
생성자 Create(MutexAttributes: PSecurityAttributes; InitialOwner: Boolean; const 이름:string);
절차 무시;
끝;
TSemaphore = 클래스(THandleObjectEx)
//신호등 클래스
공공의
생성자 Create(SemaphoreAttributes: PSecurityAttributes;InitialCount:Integer;MaximumCount: 정수; const 이름: 문자열);
프로시저 Release(ReleaseCount: Integer=1;PreviousCount:Pointer=nil);