跨平台方式,以防止打开应用程序的多个实例

Cross platform way to prevent opening multiple instances of an application

本文关键字:应用程序 实例 方式 跨平台      更新时间:2023-10-16

这些问题如何阻止运行同一程序的两个实例?,如何在C或C++中创建单个实例应用程序和防止我的应用程序的多个实例解决如何防止为一个平台打开同一应用程序的多个实例(WindowsLinux(。

有没有跨平台的方法来实现这一点?

回答我的问题,因为我在其他问题中没有找到其他人解决这个问题。

这可以使用boost/interprocess/sync/named_mutex以跨平台的方式实现(我使用boost 1.63(

我在LinuxWindows上都进行了测试,并且该实现阻止打开应用程序的第二个实例。

我发现的问题是,如果我终止进程(在两个平台上(,则不会删除互斥锁,因为未调用析构函数~MyApplication。因此,只有在系统重新启动后,我才能再次运行该应用程序。

#include <boost/interprocess/sync/named_mutex.hpp>
#include <iostream>
class MyApplication
{
public:
    MyApplication() = default;
    ~MyApplication()
    {
        if (mLockedByThisInstance)
        {
            boost::interprocess::named_mutex::remove("myApplicationMutex");
        }
    }
    bool IsAlreadyRunning()
    {
        mLockedByThisInstance = mNamedMutex.try_lock();
        if (!mLockedByThisInstance)
        {
            return true;
        }
        return false;
    }
    int Run(int argc, char *argv[])
    {
        // Application main loop            
        return 0;
    }
private:
    bool mLockedByThisInstance = false;
    boost::interprocess::named_mutex mNamedMutex{ boost::interprocess::open_or_create,
        "myApplicationMutex" };
};
int main(int argc, char *argv[])
{
    MyApplication myApplication;
    if (myApplication.IsAlreadyRunning())
    {
        std::cout << "MyApplication is already running!n";
        return 1;
    }
    return myApplication.Run(argc, argv);
}

这不是一个完整的答案,但可以研究一下诸如持有特定文件句柄以进行独占访问之类的事情。您可以像互斥锁一样使用它,但还有一个额外的好处,即操作系统应该在进程终止时自动"清理"句柄。

我不能说这是否适用于Linux,但至少在Windows上,这应该可以让您达到相同的效果。希望有帮助。