HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner , LPCTSTR lpName );lpMutexAttributes は、セキュリティ属性構造体へのポインタを指定します
HANDLE OpenMutex( DWORD dwDesiredAccess , BOOL bInheritHandle, LPCTSTR lpName );dwDesiredAccess には、ミューテックスオブジェクトに対するアクセス要求を指定します
| オブジェクト | 解説 | 
|---|---|
| 変更通知 | このハンドルは、FindFirstChangeNotification() 関数が返します 変更通知オブジェクトは、指定したディレクトリまたはディレクトリツリーの中で 指定した種類の変更が発生したときに、シグナル状態になります  | 
| コンソール入力 | このハンドルは、CreateFile() 関数 (CONIN$ 指定) またはGetStdHandle() 関数が返します このオブジェクトは、コンソールの入力バッファ内に 読み取られていない入力が残っているときはシグナル状態になり 入力バッファが空のときは非シグナル状態になります  | 
| イベント | このハンドルは、CreateEvent() 関数または OpenEvent() 関数が返します イベントオブジェクトは、SetEvent() 関数 または PulseEvent() 関数呼び出しによってシグナル状態になります 手動リセットイベントオブジェクトは、ResetEvent() 関数を使って 明示的に非シグナル状態に再設定しなければなりません 自動リセットイベントオブジェクトは、待機関数が制御を返す前に 自動的に非シグナル状態になります イベントオブジェクトは、非同期操作でも使われます この場合は、システムがオブジェクトの状態を設定します  | 
| ミューテックス | このハンドルは、CreateMutex() 関数または OpenMutex() 関数が返します ミューテックスオブジェクトは、スレッドに所有されているときは非シグナル状態に スレッドに所有されていないときはシグナル状態になります 待機関数は所有権を要求し、所有権が与えられた時点で その状態を非シグナル状態に変更します  | 
| プロセス | このハンドルは、CreateProcess() 関数または OpenProcess() 関数が返します プロセスオブジェクトは、プロセスが終了するとシグナル状態になります  | 
| セマフォ | このハンドルは、CreateSemaphore() 関数または OpenSemaphore() 関数が返します セマフォオブジェクトは、カウントが 0 よりも大きいときにシグナル状態になり カウントが 0 のときに非シグナル状態になります 現在の状態がシグナル状態の場合、待機関数はカウントを 1 つ減らします  | 
| スレッド | このハンドルは、CreateProcess() 関数、CreateThread() 関数 CreateRemoteThread() 関数が返します スレッドオブジェクトは、スレッドが終了するとシグナル状態になります  | 
| タイマー | タイマーのハンドルは、CreateWaitableTimer() 関数かOpenWaitableTimer() 関数が返します SetWaitableTimer 関数を呼び出してタイマーをアクティブ化します アクティブなタイマーが時間切れになると、シグナル状態になります CancelWaitableTimer() 関数を呼び出すと、タイマーは非アクティブ化します  | 
| 定数 | 解説 | 
|---|---|
| WAIT_ABANDONED | 指定されたオブジェクトは 放棄されたミューテックスオブジェクトでした (あるスレッドが所有権を持っていましたが そのスレッドは所有権を解放しないで終了しました) この関数の呼び出しにより、ミューテックスの所有権は呼び出し側スレッドに移り 状態は非シグナル状態になりました  | 
| WAIT_OBJECT_0 | 指定したオブジェクトがシグナル状態になったので 制御を返しました  | 
| WAIT_TIMEOUT | タイムアウト時間が経過したので、制御を返しました 指定されたオブジェクトは非シグナル状態のままです  | 
| WAIT_FAILED | 関数は失敗しました | 
#include <windows.h>
#define MUTEX TEXT("KITTU_MUTEX")
DWORD WINAPI ThreadFunc(LPVOID hWnd) {
	HDC hdc;
	TCHAR str[32];
	int iCount;
	HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS , FALSE , MUTEX);
	SetWindowText(hWnd , TEXT("ミューテックスの解放を待っています"));
	WaitForSingleObject(hMutex , INFINITE);
	SetWindowText(hWnd , TEXT("処理中です..."));
	for (iCount = 0 ; iCount < 1000 ; iCount++) {
		hdc = GetDC(hWnd);
		wsprintf(str , TEXT("Count = %d") , iCount);
		TextOut(hdc , 0 , 0 , str , lstrlen(str));
		Sleep(10);
		ReleaseDC(hWnd , hdc);
	}
	SetWindowText(hWnd , TEXT("ミューテックスを解放しました"));
	ReleaseMutex(hMutex);
	CloseHandle(hMutex);
	ExitThread(TRUE);
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	DWORD dwParam;
	static HANDLE hMutex;
	switch (msg) {
	case WM_DESTROY:
		if (hMutex) CloseHandle(hMutex);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hMutex = CreateMutex(NULL , FALSE , MUTEX);
		CreateThread(
			NULL , 0 , ThreadFunc , hWnd , 0 , &dwParam);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			200 , 100 , NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount , LONG lMaximumCount, LPCTSTR lpName );lpSemaphoreAttributes には、セキュリティ属性構造体へのポインタを指定します
HANDLE OpenSemaphore( DWORD dwDesiredAccess , BOOL bInheritHandle , LPCTSTR lpName );dwDesiredAccess にはセマフォオブジェクトに対するアクセス要求を指定します
| 定数 | 解説 | 
|---|---|
| SEMAPHORE_ALL_ACCESS | セマフォオブジェクトに対して可能なすべてのアクセスを要求します | 
| SEMAPHORE_MODIFY_STATE | ReleaseSemaphore() 関数によるカウント値の修正を要求します | 
| SYNCHRONIZE | Windows NT: 待機関数での使用を要求します  | 
BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount );hSemaphore には、対象のセマフォオブジェクトを指定します
#include <windows.h>
#define SEMAPHORE TEXT("KITTU_SEMAPHORE")
DWORD WINAPI ThreadFunc(LPVOID hWnd) {
	HDC hdc;
	TCHAR str[32];
	int iCount;
	HANDLE hSemaphore = OpenSemaphore(
		SEMAPHORE_ALL_ACCESS , FALSE , SEMAPHORE);
	SetWindowText(hWnd , TEXT("順番を待っています"));
	WaitForSingleObject(hSemaphore , INFINITE);
	SetWindowText(hWnd , TEXT("処理中です..."));
	for (iCount = 0 ; iCount < 1000 ; iCount++) {
		hdc = GetDC(hWnd);
		wsprintf(str , TEXT("Count = %d") , iCount);
		TextOut(hdc , 0 , 0 , str , lstrlen(str));
		Sleep(10);
		ReleaseDC(hWnd , hdc);
	}
	SetWindowText(hWnd , TEXT("処理を終了しました"));
	ReleaseSemaphore(hSemaphore , 1 , NULL);
	CloseHandle(hSemaphore);
	ExitThread(TRUE);
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	DWORD dwParam;
	static HANDLE hSemaphore;
	switch (msg) {
	case WM_DESTROY:
		if (hSemaphore) CloseHandle(hSemaphore);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hSemaphore = CreateSemaphore(NULL , 2 , 2 , SEMAPHORE);
		CreateThread(
			NULL , 0 , ThreadFunc , hWnd , 0 , &dwParam);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			200 , 100 , NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
このプログラムは、ミューテックスのプログラムをセマフォに改良したのですHANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes , BOOL bManualReset , BOOL bInitialState , LPCTSTR lpName );lpEventAttributes は、セキュリティ属性構造体へのポインタを指定します
HANDLE OpenEvent( DWORD dwDesiredAccess , BOOL bInheritHandle , LPCTSTR lpName );dwDesiredAccess にはイベントオブジェクトに対して要求するアクセスの種類を指定します
| 定数 | 解説 | 
|---|---|
| EVENT_ALL_ACCESS | イベントオブジェクトに対して可能なアクセスすべて | 
| EVENT_MODIFY_STATE | SetEvent関数とResetEvent関数によるイベントの状態の変更 | 
| SYNCHRONIZE | Windows NT: 待機関数によるイベントのシグナル化待ち  | 
#include <windows.h>
#define EVENT TEXT("KITTU_EVENT")
DWORD WINAPI ThreadFunc(LPVOID hWnd) {
	HDC hdc;
	TCHAR str[32];
	int iCount;
	HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS , FALSE , EVENT);
	SetWindowText(hWnd , TEXT("待機しています"));
	WaitForSingleObject(hEvent , INFINITE);
	ResetEvent(hEvent);
	SetWindowText(hWnd , TEXT("処理中です..."));
	for (iCount = 0 ; iCount < 1000 ; iCount++) {
		hdc = GetDC(hWnd);
		wsprintf(str , TEXT("Count = %d") , iCount);
		TextOut(hdc , 0 , 0 , str , lstrlen(str));
		Sleep(10);
		ReleaseDC(hWnd , hdc);
	}
	SetWindowText(hWnd , TEXT("処理を終了しました"));
	CloseHandle(hEvent);
	ExitThread(TRUE);
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	DWORD dwParam;
	static HANDLE hEvent;
	switch (msg) {
	case WM_DESTROY:
		if (hEvent) CloseHandle(hEvent);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hEvent = CreateEvent(NULL , TRUE , FALSE , EVENT);
		CreateThread(
			NULL , 0 , ThreadFunc , hWnd , 0 , &dwParam);
		return 0;
	case WM_LBUTTONUP:
		SetEvent(hEvent);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			200 , 100 , NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
このプログラムを実行すると、まずスレッドが生成されますHANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner , LPCTSTR lpName );ミューテックスオブジェクトを作成します
HANDLE OpenMutex( DWORD dwDesiredAccess , BOOL bInheritHandle, LPCTSTR lpName );作成済みのミューテックスオブジェクトを開きます
| 定数 | 解説 | 
|---|---|
| MUTEX_ALL_ACCESS | ミューテックスオブジェクトに対して可能なすべてのアクセスを要求します | 
| SYNCHRONIZE | Windows NT: 待機関数や ReleaseMutex 関数でのミューテックスハンドルの使用を要求します  | 
| 定数 | 解説 | 
|---|---|
| WAIT_ABANDONED | 指定されたオブジェクトは 放棄されたミューテックスオブジェクトでした (あるスレッドが所有権を持っていましたが そのスレッドは所有権を解放しないで終了しました) この関数の呼び出しにより、ミューテックスの所有権は呼び出し側スレッドに移り 状態は非シグナル状態になりました  | 
| WAIT_OBJECT_0 | 指定したオブジェクトがシグナル状態になったので 制御を返しました  | 
| WAIT_TIMEOUT | タイムアウト時間が経過したので、制御を返しました 指定されたオブジェクトは非シグナル状態のままです  | 
| WAIT_FAILED | 関数は失敗しました | 
HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount , LONG lMaximumCount, LPCTSTR lpName );セマフォオブジェクトを作成します
HANDLE OpenSemaphore( DWORD dwDesiredAccess , BOOL bInheritHandle , LPCTSTR lpName );作成済みのセマフォオブジェクトを開きます
| 定数 | 解説 | 
|---|---|
| SEMAPHORE_ALL_ACCESS | セマフォオブジェクトに対して可能なすべてのアクセスを要求します | 
| SEMAPHORE_MODIFY_STATE | ReleaseSemaphore() 関数によるカウント値の修正を要求します | 
| SYNCHRONIZE | Windows NT: 待機関数での使用を要求します  | 
BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount );セマフォオブジェクトのカウンタをし定数だけ増やします
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes , BOOL bManualReset , BOOL bInitialState , LPCTSTR lpName );イベントオブジェクトを作成します
HANDLE OpenEvent( DWORD dwDesiredAccess , BOOL bInheritHandle , LPCTSTR lpName );作成済みのイベントオブジェクトを開きます
| 定数 | 解説 | 
|---|---|
| EVENT_ALL_ACCESS | イベントオブジェクトに対して可能なアクセスすべて | 
| EVENT_MODIFY_STATE | SetEvent関数とResetEvent関数によるイベントの状態の変更 | 
| SYNCHRONIZE | Windows NT: 待機関数によるイベントのシグナル化待ち  |