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

何为互斥体

引用了百科的话

互斥体实现了“互相排斥”(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的错误返回值,
判断后直接返回,这样就实现了,程序的单个运行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值