#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <time.h>
#define Threadsuu 10

//グローバル変数に排他制御をして複数スレッドからアクセスするサンプル
int sum=0;

unsigned WINAPI fnc(void *num_){
int num=(int)num_;
//既存の名前付きミューテックスをオープンしてそのハンドルを取得
HANDLE hmutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "test");
for(int i=0; i<10; i++) {
WaitForSingleObject(hmutex, INFINITE); //この行をコメントアウトすると排
他制御を行わなくなり合計が変化する。
int a=sum; Sleep(1); sum=a+num;
ReleaseMutex(hmutex); // ミューテックス開放
}
CloseHandle(hmutex); return 0; }


int main(){
srand(time(NULL));
HANDLE hMutex = CreateMutex(NULL, FALSE, "test");
HANDLE hThread[Threadsuu];

for(int i=0; i<Threadsuu; i++)
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, fnc, (void*)i, 0 ,NULL);
WaitForMultipleObjects(Threadsuu, hThread, TRUE, INFINITE);
printf("合計 %3d\n", sum);
CloseHandle(hMutex);
for(int i=0; i<Threadsuu; i++) CloseHandle(hThread[i]);
}