何をする関数かというと、指定した変数の値を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