何为互斥体

引用了百科的话

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

使用互斥体使程序只运行一个相关推荐

  1. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  2. CreateMutex创建互斥体可以用于只运行进程的一个实例

    CreateMutex 作用 找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体.CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为 VC声明 HANDLE ...

  3. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  4. Qt应用程序只运行一个实例

    在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...

  5. 只运行一个实例的方法

    在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...

  6. 为什么建议一个容器中只运行一个进程

    文章首发于:https://www.cnblogs.com/JasonCeng/p/14814888.html 在云原生与容器化时代浪潮下,大多数新手的普遍认识是"容器=虚拟机", ...

  7. 只运行一个实例的写法

    有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行.我们通常通过Mutex互斥体在Main函数中实现,通常的写法是: [STAThread] st ...

  8. 限制程序只打开一个实例(转载)

    当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...

  9. 让你的程序只能运行一个实例

        先说一个循环系统进程的方法吧,             //首先取得你的程序当前进程             Process current = Process.GetCurrentProce ...

最新文章

  1. 服务器系统防火墙例外,Windows Server 2012设置端口例外、防火墙设置方法
  2. Java魔法堂:初探MessageFormat.format和ChoiceFormat
  3. python size(0)_对x.view(x.size(0), -1)的一些理解
  4. Java的直接量——2017.08.01
  5. jupyter notebook如何打开其他文件夹下的iqynb文件
  6. 基于Zigbee的智能家居系统
  7. ffmpeg教程 php推流,详解NODEJS基于FFMPEG视频推流测试
  8. PMP第11章:项目风险管理易错习题和知识点汇总
  9. 关于timestamp时间范围
  10. 本人新开的一个人才网站,玉环人力网
  11. java 2048思路_Java版2048
  12. 在国企的日子(第四章 团建)
  13. 牛顿法(Newton‘s method)和拟牛顿法(quasi Newton method)
  14. MANIFEST.MF属性读写
  15. 计算机网络如何选择路由器,无线路由器如何选择上网方式_路由器上网方式选哪个?-192路由网...
  16. CCNA与CCNP的路该如何走?
  17. 装X神器:快速玩刺激战场国际服?另附刺激战场国际服电脑版教程
  18. JQ插件Ztree的简单使用
  19. 六、Linux权限管理
  20. 什么是“门级网表”(Gate-level netlist)文件?

热门文章

  1. 电脑剪贴板在哪里打开_这个小玩意让手机的推送无缝显示在电脑上_办公软件...
  2. Java黑皮书课后题第1章:1.2(显示五条消息)编写程序,显示以下表格
  3. Perfect World
  4. 使用nsenter进入docker容器后端报错 mesg: ttyname failed: No such file or directory
  5. Linux交换Esc和Caps
  6. ArcGIS API for JavaScript Bookmarks(书签)
  7. Jquery日历编写小练习
  8. 修改 wordpress 后台管理员登录地址
  9. BIEE汇总数据如何放在后面
  10. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug