互斥量Mutex
C++使用内核对象Mutex来实现线程同步锁。当两个或者更多线程需要同时访问一个共享资源时,Mutex可以只向一个线程授予对共享资源的独占访问权,如果第一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,知道第一个线程释放该互斥体
相关API函数:
创建互斥量
CreateMutex();
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针,一般为NULL
BOOLbInitialOwner, // 初始化互斥对象的所有者,TRUE表示调用互斥对象的线程获得互斥对象的所有权,为FALSE表示不拥有
LPCTSTRlpName // 指向互斥对象名的指针,传NULL表示匿名互斥量
);
函数成功返回句柄,如果创建已有互斥量,那么返回已经存在的信号量句柄,GetLastError也会设置为ERROR_ALREADY_EXISTS,失败返回NULL
ReleaseMutex() 释放线程拥有的互斥体的控制权。
BOOL WINAPI ReleaseMutex(
HANDLE hMutex //互斥体句柄
);
利用mutex也可以实现进程只有一个实例
方法:
进程第一次启动时成功创建名为mutex实例成功,此后进程实例第二次创建时,GetLastError()会返回ERROR_ALREADY_EXISTS,从而保证进程在系统中只能存在一个实例。