제가 알기로 CreateMutex로 동기화 개체를 생성한 뮤텍스 핸들은 신호상태가 되기 전에는 WaitForSingleObject()에 의해 계속 기다리는 것으로 알고 있는데 아래의 코드를 돌려보면 동적으로 생성한 쓰레드에서는 WaitForSingleObject()에서 기다리는데 정작 뮤텍스를 생성한 함수에서는 먹히지 않는군요.
type
TForm1 = class(TForm)
Button1: TButton;
procedure CreateThreadClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MutexHandle, ThreadHandle, ThreadHandle1 : THandle;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function ThreadFunc0(Info: Pointer): Integer; stdcall
var
ICount: Integer; // general loop counter
CountStr: string; // holds a string representation of the counter
begin
WaitForSingleObject(Form1.MutexHandle, INFINITE);
for ICount := 1 to 10000 do
begin
CountStr := IntToStr(ICount);
Form1.Canvas.TextOut(10, 10, 'Thread 1 '+CountStr);
end;
ReleaseMutex(Form1.MutexHandle);
WaitForSingleObject(Form1.MutexHandle, INFINITE);
ExitThread(1);
end;
function ThreadFunc1(Info: Pointer): Integer; stdcall
var
ICount: Integer; // general loop counter
CountStr: string; // holds a string representation of the counter
begin
WaitForSingleObject(Form1.MutexHandle, INFINITE);
for ICount := 1 to 10000 do
begin
CountStr := IntToStr(ICount);
Form1.Canvas.TextOut(110, 10, 'Thread 2 '+CountStr);
end;
ReleaseMutex(Form1.MutexHandle);
ExitThread(2);
end;
procedure TForm1.CreateThreadClick(Sender: TObject);
var
ThreadId0, ThreadId1, ThreadId2: DWORD; // holds thread identifiers
begin
MutexHandle := CreateMutex(nil, False, 'MyMutex');
ThreadHandle := Windows.CreateThread(nil, 0, @ThreadFunc0, nil, 0, ThreadId0);
ThreadHandle1 := Windows.CreateThread(nil,0, @ThreadFunc1, nil, 0, ThreadId1);
sleep(1000);
WaitForSingleObject(MutexHandle, INFINITE); // 여기에서는 MutexHandle이 신호상태가 되어 넘어가지만
WaitForSingleObject(MutexHandle, INFINITE); // 여기에서는 비신호상태가 되어 계속 남아있어야 할 것 같은데
// 아래에 SHowMessage('1')이 실행됨.
ShowMessage('1');
CloseHandle(MutexHandle);
end;
즉, ShowMessage('1')이 실행되기 전에 두번째 WaitForSingleObject()에 의해 계속 Holding상태가 되어야 할 것같은데 다음 라인으로 명령이 넘어갑니다.
이유가 무었인지 좀 가르쳐 주세요....