今回はInterlockedIncrement関数についてやります。何をする関数かというと、指定した変数の値を1増やします。 複数のスレッドがこの変数を同時に使うことを防止します。
LONG InterlockedIncrement( LPLONG lpAddend // 1増加させる変数 );lpAddendにインクリメントすべき変数へのポインタを指定します。
Windows98/WindowsNT以降はインクリメントした値を返します。 それ以前のOSでは、インクリメント後の値が正なら正の数を負なら負の数を返し、0なら0を返します。
InterlockedDecrement関数というのもあります。これは、デクリメントします。
LONG InterlockedDecrement( LPLONG lpAddend // 変数へのポインタ );では、サンプルを見てみましょう。
// interlocked01.c
#include <stdio.h>
#include <process.h>
#include <windows.h>
unsigned __stdcall mythread0(void *);
unsigned __stdcall mythread1(void *);
unsigned __stdcall mythread2(void *);
LONG lAdd = 0;
int n = 0;
int main()
{
	HANDLE hTh[3];
	DWORD dwID[3];
	int i;
	hTh[0] = (HANDLE)_beginthreadex(
        NULL,
        0,
        mythread0,
        NULL,
        CREATE_SUSPENDED,
        &dwID[0]
    );
	hTh[1] = (HANDLE)_beginthreadex(
        NULL,
        0,
        mythread1,
        NULL,
        CREATE_SUSPENDED,
        &dwID[1]
    );
	hTh[2] = (HANDLE)_beginthreadex(
        NULL,
        0,
        mythread2,
        NULL,
        CREATE_SUSPENDED,
        &dwID[2]
    );
	for (i = 0; i < 3; i++)
        ResumeThread(hTh[i]);
	WaitForMultipleObjects(3, hTh, TRUE, INFINITE);
	for (i = 0; i < 3; i++)        
        CloseHandle(hTh[i]);
	return 0;
}
unsigned __stdcall mythread0(void *lpx)
{
	while (lAdd < 100) {
		InterlockedIncrement(&lAdd);
		printf("thread0--%d\n", lAdd);
		Sleep(10);
	}
	return 0;
}
unsigned __stdcall mythread1(void *lpx)
{
	while (lAdd < 100) {
		InterlockedIncrement(&lAdd);
		printf("thread1--%d\n", lAdd);
		Sleep(10);
	}
	return 0;
}
unsigned __stdcall mythread2(void *lpx)
{
	while (lAdd < 100) {
		InterlockedIncrement(&lAdd);
		printf("thread2--%d\n", lAdd);
		Sleep(10);
	}
	return 0;
}
では、実行してみましょう。
いろいろなスレッドが値を増やして表示していますね。
必ずしも順番に表示されているわけではありませんが、同じ数字がダブっているものは ありません。
Update Apr/24/2005 By Y.Kumei