#include "stdafx.h"
#include <windows.h>
int g_num = 0;
HANDLE g_hMutex = nullptr;
DWORD WINAPI ThreadProcA(LPVOID lpParam)
{
for (int i = 0; i < 5;i++)
{
//等待g_hMutex信号,如果有信号,把它设置为无信号状态,
// 然后执行后面的代码
//
// g_hMutex就被当前线程拥有,其他线程布恩那个调用ReleaseMutex释放
// 只有当前线程可以调用ReleaseMutex使g_hMutex变为有信号
// 加入拥有者线程,因为某种原因,线程崩溃,退出
// 系统会把当前线程所占用的互斥体重新设置为有信号状态
// 其他等待线程可以立刻拥有
// 如果当前线程假死,其他线程陪着它卡死
WaitForSingleObject(g_hMutex, INFINITE);
printf("%d\n",g_num++);
ReleaseMutex(g_hMutex);
}
return 0;
}
DWORD WINAPI ThreadProcB(LPVOID lpParam)
{
for (int i = 0; i < 5;i++)
{
WaitForSingleObject(g_hMutex,INFINITE);
printf("%d\n",g_num++);
ReleaseMutex(g_hMutex);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*
* 创建互斥体对象CreateMutex
* 参数1:安全属性,默认
* 参数2:创建的时候,是否占信号,g_hMutex处于有信号状态
* TRUE,g_hMutex就会被主线程占用,下面两个子线程就会卡死
* 参数3: 互斥体是否有名字
**/
if (!(g_hMutex = CreateMutex(NULL, FALSE, NULL)))return 0;
HANDLE hHandle[2] = {};
hHandle[1] = CreateThread(NULL, 0, ThreadProcA, NULL, 0, NULL);
hHandle[2] = CreateThread(NULL, 0, ThreadProcB, NULL, 0, NULL);
// 等待所有线程全部返回
WaitForMultipleObjects(2, hHandle, TRUE, INFINITE);
system("pause");
return 0;
}
【Windows原理】线程同步-互斥体
最新推荐文章于 2022-03-28 10:54:35 发布