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

来源:互联网 发布:cpi数据分析 编辑:程序博客网 时间:2024/05/21 10:18

《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);

原创粉丝点击