版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/79340081
互斥量接口:
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中的运行结果如下:
可见线程同步问题没有得到好的解决。
互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。