今回は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