Win32API ミューテックスによるスレッドの排他制御

ミューテックスによるスレッドの排他制御

使用するAPI

  • CreateMutex

  • WaitForSingleObject

  • ReleaseMutex

  • _beginthreadex

  • WaitForMultipleObjects

  • CloseHandle
  • HANDLE CreateMutex(
      LPSECURITY_ATTRIBUTES lpMutexAttributes,  // セキュリティ記述子
      BOOL bInitialOwner,                       // 最初の所有者
      LPCTSTR lpName                            // オブジェクトの名前
    );



    ミューテックスによる排他制御コンテキストスイッチを伴うため、クリティカルセクションによる排他制御よりもパフォーマンスが落ちる。

    クリティカルセクションはスレッド間の排他制御に用いられるが、ミューテックスはスレッド間およびプロセス間の排他制御にも用いることができる。



    #include <windows.h>
    #include <process.h>
    
    int g_nCount;
    HANDLE g_hMutex;
    
    unsigned int WINAPI ThreadFunc(LPVOID arg)
    {
    	int i;
    	for (i = 0; i < 100; i++) {
    		WaitForSingleObject(g_hMutex, INFINITE);
    		printf("%d\n", g_nCount++);
    		ReleaseMutex(g_hMutex);
    		Sleep(50);
    	}
    	return 0;
    }
    
    
    int main()
    {
    	HANDLE hThreads[10];
    	int nNumberOfThreads = sizeof(hThreads) / sizeof(hThreads[0]);
    	unsigned int uiThreadId;
    	int i;
    
    	g_hMutex = CreateMutex(NULL, FALSE, "Mutex");
    
    	for (i = 0; i < nNumberOfThreads; i++) {
    	
    		hThreads[i] = (HANDLE)_beginthreadex(
    			NULL,
    			0,
    			ThreadFunc,
    			NULL,
    			0,
    			&uiThreadId);
    
    		if (hThreads[i] == NULL) {
    			printf("_beginthreadex failed %d\n", i);
    		}
    
    	}
    
    	WaitForMultipleObjects(
    		nNumberOfThreads, 
    		hThreads, 
    		TRUE, 
    		INFINITE);
    
    	for (i = 0; i < nNumberOfThreads; i++) {
    		CloseHandle(hThreads[i]);
    	}
    
    	CloseHandle(g_hMutex);
    
    	return 0;
    }