应用互斥:一次只能开启一个实例

在真实应用中,经常需要一个可执行文件,只能产生一个进程,如果多次执行可能导致bug。

最典型的应用是微信,它虽然不构成多个进程存在会报异常的问题。但是它是一个很好的例子。无论怎么操作都只能在一个环境下只有一个微信进程。

为达到相同的效果可以参考本文:

应用环境:win11,mingw64(Posix),vscode

效果:模拟一个进程长时间存在,然后在执行同一个执行文件,第二个进程直接退出,保证系统只存在一个执行实例。

这里主要介绍如何在windows下如何实现,在其他系统下原理类似

项目文件:

        单进程\\

        |----main.cpp

如所见:就一个main.cpp

main.cpp内容:代码结构解读从main->ACopyFileExt如果有互斥的量,则进程直接退出,如果没有则进程继续。

#include <iostream>
#include <Windows.h>
bool ACopyFileExt()
{
	HANDLE mutex;
	mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "ACopyFileExt");
	if (mutex == NULL)
	{
		std::cout << "frist "<<std::endl;
		mutex = CreateMutex(NULL, FALSE, "ACopyFileExt");
	}
	else
	{
		std::cout << "exti "<<std::endl;
		exit(-1);
	}
	WaitForSingleObject(mutex, INFINITE);
	return 1;
}
int main(int argc, char* argv[])
{
	ACopyFileExt();
	while(1)
	{
		std::cout << "still run "<<std::endl;
		Sleep(5000);
    }
	return 0;
}

编译命令:

g++ main.cpp

此时的项目文件:

        单进程\\

        |----main.cpp

        |---a.exe

在两个命令行中运行这个执行程序:会发现一个持续运行,另一个直接退出如图:

这种操作可以用在进程间合作,也可用在进程互斥。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值