使用互斥体使程序只运行一个

来源:互联网 发布:网站建设软件下载 编辑:程序博客网 时间:2024/06/10 02:22

何为互斥体

引用了百科的话

互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。

其实互斥体就像信号量的PV操作一样的,可以用于线程间的同步,避免一个资源在被一个线程操作的同时,另外的一个线程也在进行操作,这样就会破坏操作的原子性。带来未知的错误

互斥体的作用

实际上互斥体MUTEX是用于线程同步
比如一个进程先进入临界区,先获得锁
另一个进程想进入时候try lock 发现被占用
那么直接返回,或者被挂起,等待这个资源被释放

互斥体的使用

下面就是简单的代码段,实现程序一次只能运行一个

HANDLE hMutex = NULL;//创建互斥对象 if(NULL != (hMutex = CreateMutex(NULL, FALSE, L"mutex"))){    if (GetLastError() == ERROR_ALREADY_EXISTS)    {        MessageBox(NULL, TEXT("Another Instance is RUNNING!!"), TEXT("ERROE"), MB_OK | MB_ICONINFORMATION);        //关闭互斥对象,退出程序 CloseHandle(hMutex);         exit(-1);    }}

CreateMutex 创建一个互斥体并返回它的句柄 第一个是安全属性,null是默认, 第二个参数是是否 被隶属, 第三个也就是互斥体的名字,也就是我们 防止多开的关键

原理讲解

第一次运行创建了这个有名互斥体 ,
当第二次运行时候,发现存在同名互斥体,所以返回错误
使用GetLastError() 就可以得到,ALREADY_EXISTS的错误返回值,
判断后直接返回,这样就实现了,程序的单个运行