使用互斥体使程序只运行一个
何为互斥体
引用了百科的话
互斥体实现了“互相排斥”(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的错误返回值,
判断后直接返回,这样就实现了,程序的单个运行
使用互斥体使程序只运行一个相关推荐
- 转:让程序只运行一个实例的四种方法
先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...
- CreateMutex创建互斥体可以用于只运行进程的一个实例
CreateMutex 作用 找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体.CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为 VC声明 HANDLE ...
- 让Java程序只运行一个实例
一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...
- Qt应用程序只运行一个实例
在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...
- 只运行一个实例的方法
在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...
- 为什么建议一个容器中只运行一个进程
文章首发于:https://www.cnblogs.com/JasonCeng/p/14814888.html 在云原生与容器化时代浪潮下,大多数新手的普遍认识是"容器=虚拟机", ...
- 只运行一个实例的写法
有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行.我们通常通过Mutex互斥体在Main函数中实现,通常的写法是: [STAThread] st ...
- 限制程序只打开一个实例(转载)
当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...
- 让你的程序只能运行一个实例
先说一个循环系统进程的方法吧, //首先取得你的程序当前进程 Process current = Process.GetCurrentProce ...
最新文章
- 服务器系统防火墙例外,Windows Server 2012设置端口例外、防火墙设置方法
- Java魔法堂:初探MessageFormat.format和ChoiceFormat
- python size(0)_对x.view(x.size(0), -1)的一些理解
- Java的直接量——2017.08.01
- jupyter notebook如何打开其他文件夹下的iqynb文件
- 基于Zigbee的智能家居系统
- ffmpeg教程 php推流,详解NODEJS基于FFMPEG视频推流测试
- PMP第11章:项目风险管理易错习题和知识点汇总
- 关于timestamp时间范围
- 本人新开的一个人才网站,玉环人力网
- java 2048思路_Java版2048
- 在国企的日子(第四章 团建)
- 牛顿法(Newton‘s method)和拟牛顿法(quasi Newton method)
- MANIFEST.MF属性读写
- 计算机网络如何选择路由器,无线路由器如何选择上网方式_路由器上网方式选哪个?-192路由网...
- CCNA与CCNP的路该如何走?
- 装X神器:快速玩刺激战场国际服?另附刺激战场国际服电脑版教程
- JQ插件Ztree的简单使用
- 六、Linux权限管理
- 什么是“门级网表”(Gate-level netlist)文件?
热门文章
- 电脑剪贴板在哪里打开_这个小玩意让手机的推送无缝显示在电脑上_办公软件...
- Java黑皮书课后题第1章:1.2(显示五条消息)编写程序,显示以下表格
- Perfect World
- 使用nsenter进入docker容器后端报错 mesg: ttyname failed: No such file or directory
- Linux交换Esc和Caps
- ArcGIS API for JavaScript Bookmarks(书签)
- Jquery日历编写小练习
- 修改 wordpress 后台管理员登录地址
- BIEE汇总数据如何放在后面
- 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug