OpenSemaphore セマフォオブジェクトのオープン

Cの宣言:

HANDLE OpenSemaphore(DWORD Access, BOOL Inherit, LPCTSTR SemaphoreName);

説明:

SemaphoreNameで指定された名前を持つ既存のセマフォオブジェクトをオープンする。

引数の意味は、以下の通り。
Access (IN) セマフォオブジェクトに対するアクセス権の指定。後述の表を参照。
Inherit (IN) 戻り値のハンドルを継承可能か否かを表す真偽値。
SemaphoreName (IN) オープンするセマフォオブジェクトの名前。

Accessには、以下のフラグの論理和を指定する。
SEMAPHORE_MODIFY_STATE セマフォオブジェクトの内部カウンタを修正可能。
SYNCHRONIZE 待機関数を使用可能。(NTのみ)
SEMAPHORE_ALL_ACCESS すべてのアクセスが可能。

関数の実行に成功した場合、SemaphoreNameで指定されたセマフォオブジェクトのハンドルが返される。関数の実行に失敗した場合、NULLが返される。

Cのサンプル:

#define SEMAPHORE_NAME "Test Semaphore Object"
 
/* 1度に3つまでしか実行できないスレッド関数	*/
DWORD WINAPI DoThread(DWORD ThreadCount)
{
	HANDLE hSemaphore;

	/* セマフォオブジェクトの取得 */
	hSemaphore = OpenSemaphore(
		SEMAPHORE_MODIFY_STATE | SYNCHRONIZE, 
		FALSE, 
		SEMAPHORE_NAME);

	/* 待機 */
	WaitForSingleObject(hSemaphore, INFINITE);

	/* 処理 */
	printf("スレッド%d: 処理開始\n", ThreadCount);
	Sleep(1000);
	printf("スレッド%d: 処理終了\n", ThreadCount);

	/* 後処理 */
	ReleaseSemaphore(hSemaphore, 1, NULL);
	CloseHandle(hSemaphore);
	return(0);
        
}

/* メイン関数 */
int main(int argc, char **argv)
{
	HANDLE hThread[5];
	HANDLE hSemaphore;
	int i;
	
	/* セマフォオブジェクトの作成 */
	hSemaphore = CreateSemaphore(NULL, 3, 3, SEMAPHORE_NAME);

	/* スレッドを5つ作成 */
	for(i=0; i<5; i++) {
		hThread[i] = CreateThread(
			NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
			(LPVOID)i, 0, NULL);
		Sleep(100);
	}

	/* スレッドの終了まで待機 */
	WaitForMultipleObjects(5, hThread, TRUE, INFINITE);


	/* 後処理 */
	CloseHandle(hSemaphore);
	
	for(i=0; i<5; i++) CloseHandle(hThread[i]);
	return(0);
}

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。