1)使用互斥对象Mutex(内核对象)
HANDLE hMutex;
hMutex = CreateMutex(nullptr,FALSE,nullptr); //FALSE表示创建互斥对象的线程不拥有该互斥对象,为已通知状态(即有信号状态,能让其他线程使用)
WaitForSingleObject(hMutex,INFINITE); //使用hMutex,将hMutex设为未通知状态
·····
·····
ReleaseMutex(hMutex); //释放互斥对象hMutex的所有权,使其处于已通知状态
注:在哪个线程WaitForSingleObject,就只能在该线程ReleaseMutex,不能再其他线程ReleaseMutex,因为内核互斥对象拥有线程ID标识。
2)使用 事件对象(内核对象)
HANDLE g_hEvent; //保存事件对象句柄
g_hEvent = CreateEvent(nullptr,FALSE,FALSE,nullptr); //FALSE:自动重置信号 FALSE:初始非信号(不能被别的线程使用)
SetEvent(g_hEvent); //设置为有信号
WaitForSingleObject(g_hEvent,INFINITE);//自动重置时,该语句使g_hEvent从有信号变为非信号
·····
·····
SetEvent(g_hEvent); //将事件对象设为有信号状态(可被其他线程使用),当人工重置事件时,等待同一事件的线程可同时运行,当自动重置事件时,等待同一事件的线程只有一个能运行。
//ResetEvent(g_hEvent); //设为非信号
CloseHandle(g_hEvent); //最后,关闭句柄
3)关键代码段(临界区对象)
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs);
·····
·····
LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs); //最后,销毁临界区资源
转载于:https://blog.51cto.com/whatever957/1669209