トップへ

  検索 辞書 交通 地図 天気

マルチスレッドプログラミング
Windows Visual C++ でマルチスレッドを使うサンプルプログラムです. mutex で変数の同期を行っています.count1 と count2 の振舞いの違いを見ればどうなっているのか分かると思います. linux gcc 版を探している方はこちらへどうぞ.

//マルチスレッドプログラムと mutex の使い方
#include <stdio.h>
#include <windows.h>
#include <process.h>

HANDLE	hMutex; //ミューテックスのハンドル
int main(void);

int count1 = 0; //mutex で変数を保護する
int count2 = 0; //保護しない

void func1(LPVOID	pParam)
{
	int	i;
	while(1){
		WaitForSingleObject(hMutex,INFINITE); //mutex 間は他のスレッドから変数を変更できない
		printf("count1:");
		for(i=0;i<10;i++){
			printf("%d:",count1);
			count1++;
			Sleep(50);
		}
		printf("\n");
		ReleaseMutex(hMutex);

		//mutex で変数を保護しないと他のスレッドから変数を変更できる
		printf("count2:");
		for(i=0;i<10;i++){
			printf("%d:",count2);
			count2++;
			Sleep(50);
		}
		printf("\n");
	}
}

void func2(LPVOID	pParam)
{
	while(1){	
		//mutex で  count1 を保護
		WaitForSingleObject(hMutex,INFINITE);
		count1=0;
		ReleaseMutex(hMutex);

		count2=0;
	}
}

int main(void){
	HANDLE	hThread[2];

	hMutex = CreateMutex(NULL,FALSE,NULL);	//ミューテックス生成

	hThread[0] = (HANDLE)_beginthread(func1,0,NULL);	//スレッド1作成
	hThread[1] = (HANDLE)_beginthread(func2,0,NULL);	//スレッド2作成

	//スレッド1、2終了待ち
	WaitForMultipleObjects(2,hThread,TRUE,INFINITE);

	//ハンドルクローズ
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);
	CloseHandle(hMutex);

	return 0;
}

トップへ他のサンプルプログラムへ

月に2回程度の更新を目標としています

Copyright(c) Masaki Onishi All rights reserved.