1. 程式人生 > >Windows執行緒(七)使用互斥量無法解決執行緒同步問題

Windows執行緒(七)使用互斥量無法解決執行緒同步問題

互斥量介面:

1.建立互斥量:
HANDLE CreateMutex
(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全控制,一般為NULL
    BOOL bInitialOwner,                     //互斥量的初始擁有者
    LPCTSTR lpName                          //互斥量的名稱
);
2.開啟互斥量
HANDLE OpenMutex
(
    DWORD dwDesireAccess,       //引數訪問許可權,一般為MUTEX_ALL_ACCESS
    BOOL
bInheritHandle, //互斥量控制代碼繼承性,一般為true LPCTSTR lpName //互斥量名稱 ); 3.觸發互斥量 BOOL ReleaseMutex(HANDLE hMutex);

互斥量測試程式碼如下所示:


#include <Windows.h>
#include <process.h>
#include <stdio.h>

#define THREAD_NUM 10

unsigned long g_nNum;

HANDLE g_hThreadParameter;
CRITICAL_SECTION g_csThreadCode;

unsigned
int __stdcall ThreadFun(void *pM) { int nThreadNum = *(int *)pM; ReleaseMutex(g_hThreadParameter); Sleep(50); EnterCriticalSection(&g_csThreadCode); g_nNum++; Sleep(0); printf("執行緒編號為%d 全域性資源值為%d\n", nThreadNum, g_nNum); LeaveCriticalSection(&g_csThreadCode); return
0; } int main() { HANDLE handle[THREAD_NUM]; int i = 0; g_hThreadParameter = CreateMutex(NULL, 0, NULL); InitializeCriticalSection(&g_csThreadCode); printf("--------------------執行緒同步之互斥量--------------------\n"); while(i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL); WaitForSingleObject(g_hThreadParameter, INFINITE); i++; } WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE); CloseHandle(g_hThreadParameter); DeleteCriticalSection(&g_csThreadCode); for(i = 0; i < THREAD_NUM; i++) { CloseHandle(handle[i]); } system("pause"); return 0; }

以上程式碼在Visual Studio 2010中的執行結果如下:


這裡寫圖片描述


可見執行緒同步問題沒有得到好的解決。
互斥量是核心物件,它與關鍵段都有“執行緒所有權”所以不能用於執行緒的同步。