InterlockedIncrement 共有されている変数のインクリメント

Cの宣言:


LONG InterlockedIncrement(LPLONG pVal);

VBの宣言:

Declare Function "InterlockedIncrement" Lib "kernel32" (ByRef V As Long) As Long

説明:

複数のスレッドから参照される32bit値をインクリメントする。プロセス間での使用も可能である。

コンパイル結果の実行コードや実行環境によっては、複数のスレッドから参照される値を単純にインクリメントすると不都合が起きる場合がある。このような場合に、InterlockedIncrement関数を使用する。

この関数は、NTのみ使用可能。

引数は、以下の通り。
pVal out インクリメントする32bit値へのポインタ。

戻り値は、インクリメントの結果が0の場合は0が返される。0以外の場合、インクリメントの結果の正負と戻り値の正負は一致する。

実行環境がマルチプロセッサシステムならば、pValが指すメモリ領域は32bit境界に整列されていなければならない。

Cのサンプル:

1つの32bit値を複数のスレッドが共有する際に、InterlockedIncrement関数を用いて安全に32bit値をインクリメントする。
/* スレッド関数
 * カウンタを10000000増やす
 */
DWORD WINAPI DoThread(LPDWORD pCnt)
{
	int i;

	for(i=0; i<10000000; i++) {
		InterlockedIncrement(pCnt);
	}

	return(0);

}

/* メイン関数
 * 上記スレッド関数を3個作成することにより、カウンタを30000000増やす
 */
int main(int argc, char **argv)
{
	HANDLE hThread[3];
	DWORD ThreadId;
	LPDWORD pCnt;

	int i;

	/* カウンタの初期化 */
	pCnt = GlobalAlloc(GMEM_FIXED, sizeof(DWORD));
	*pCnt = 0;
	
	/* スレッド作成 */
	for(i=0; i<3; i++) {
		hThread[i] = CreateThread(
			NULL, 0, (LPTHREAD_START_ROUTINE)DoThread, pCnt, 0, &ThreadId);
	}

	/* 待機 */
	WaitForMultipleObjects(3, hThread, TRUE, INFINITE);

	/* 実行結果表示 */
	printf("Counter = %d\n", *pCnt);

	/* 後処理 */
	for(i=0; i<3; i++) CloseHandle(hThread[i]);
	GlobalFree(pCnt);

	return(0);
}
(original text:1998/12/25 更新)

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