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