Windows執行緒(七)使用互斥量無法解決執行緒同步問題
阿新 • • 發佈:2018-12-26
互斥量介面:
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中的執行結果如下:
可見執行緒同步問題沒有得到好的解決。
互斥量是核心物件,它與關鍵段都有“執行緒所有權”所以不能用於執行緒的同步。