线程同步使用方法:CMutex_CEvent_关键代码段

本文详细介绍了Windows系统下的三种线程同步方法:CMutex、CEvent 和关键代码段(Critical Section)。通过具体实例展示了每种同步机制的工作原理及适用场景,并对比了它们之间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《WIndows核心编程》机械工艺出版社:深入的了解多线程和线程同步的问题

3个的使用范围:

1. CMutex、CEvent、关键代码段

CMutex、CEvent:属于内核对象,速度比较慢,但可以拥有跨进程的线程同步

关键代码段:工作于用户方式下,同步速度快,可能会造成死锁,不能拥有跨进程同步

1. CEvent

1.1 CEvent g_event=CreateEvent(NULL,TRUE,FALSE,NULL);

第二个参数表示:是否人工重置,若为TRUE,则必须人工调用ResetEvent进行重置,这样也不能实现多线程的同步,所以建议为FALSE,让它自动重置。

1.2 正常的使用方法

全局变量:CEvent g_event;

主线程中:

g_event=CreateEvent(NULL,FALSE,FALSE,NULL); //第二个参数表示自动该事件对象重置

SetEvent(g_event); //将g_event置为有信号

子线程中:

WaitForSingleObject(g_event,INFINITE); //将g_event置为无信号

//要保护的代码

SetEvent(g_event); //将g_event置为有信号

2. 关键代码段(适用于多个关键代码段的情形,即有多个要保护的资源,但这样可能会造成死锁)

2.1 全局变量:CRITICAL_SECTION g_cs;

主线程中:(注意时间)

InitializeCriticalSection(&g_cs);

Sleep(4000);
DeleteCriticalSection(&g_cs);

子线程中:

EnterCriticalSection(&g_cs);
LeaveCriticalSection(&g_cs);

3. CMutex

3.1 全部变量:HANDLE hMutex;

主线程中:hMutex=CreateMutex(NULL,FALSE,NULL);//第二个参数为FALSE表示当前主线程不拥有该信号量,若为TRUE,在主线程里的数据执行完,需要调用ReleaseMutex(hMutex),否则子线程将不能拥有。

子线程中:

WaitForSingleObject(hMutex,INFINITE); //将g_event置为无信号

ReleaseMutex(hMutex);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值