多线程互斥方法


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); //最后,销毁临界区资源

你可能感兴趣的:(多线程互斥方法)