第110章 InterlockedIncrement関数


今回は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;
}
では、実行してみましょう。

いろいろなスレッドが値を増やして表示していますね。

必ずしも順番に表示されているわけではありませんが、同じ数字がダブっているものは ありません。




[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Apr/24/2005 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。