32bit値のインクリメント(C言語)

キーワード:

InterlockedIncrement, GlobalAlloc, CreateThread, WaitForMultipleObjects, CloseHandle, GlobalFree

説明:

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 更新)

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