首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::interprocess::named_mutex对CreateMutex

boost::interprocess::named_mutex对CreateMutex
EN

Stack Overflow用户
提问于 2013-12-04 15:50:21
回答 2查看 3.2K关注 0票数 6

我希望从CreatMutex切换到boost::interprocess::named_mutex,以将我的应用程序限制为单个实例。当应用程序运行并结束时,这两种方法都能正常工作。但是,当应用程序崩溃并使用boost::interprocess::named_mutex时,锁不会释放。我可以通过使用两个name_mutex来解决这个问题,但我并不真正理解这个问题。

为什么当应用程序崩溃时boost::interprocess::named_mutex的锁没有释放,但是它是用CreatMutex发布的?有什么关系呢?

代码语言:javascript
复制
boost::interprocess::named_mutex mutex(boost::interprocess::open_or_create, "my_mutex");
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(mutex, boost::interprocess::try_to_lock);
if(!lock) {
    return 1; //exit
}
//application may crash here.
boost::interprocess::named_mutex::remove("my_mutex");
return 1; //exit
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-04 17:11:31

注意:我没有花太多时间在boost::interprocess上,所以这些信息只是来自于对源代码的快速检查。尽管如此,我已经使用了很多Windows同步API,所以这里.

进程间同步的两种方法的主要区别在于对象在系统中的存在方式。

使用boost::interprocess::named_mutex,以及一个特定于系统的互斥体,它看起来像是在系统上创建了一个同步对象。文件的位置是基于注册表条目(见注1) (至少在Boost 1.54.0中).它很可能位于“公共应用程序数据”文件夹下(请参见注2)。当应用程序崩溃时,在您的示例中,此文件不会被删除。我不确定这是不是故意的..。但是,在应用程序崩溃的情况下,最好不要乱搞文件系统,以防万一。

相反,当您使用CreateMutex时,会在内核模式下创建一个对象,对于命名的互斥对象,多个应用程序可以访问该对象。通过在创建Mutex时指定名称,可以获得Mutex的句柄,而调用Mutex上的CloseHandle时就会丢失句柄。当没有引用互斥对象的句柄时,互斥对象将被销毁。

其中重要的部分在documentation中:

当进程终止时,系统会自动关闭句柄。当最后一个句柄关闭时,互斥对象将被销毁。

这基本上意味着Windows将在应用程序之后进行清理。

注意,如果不执行ReleaseMutex,并且应用程序死后拥有互斥锁,那么等待的线程或进程可能/很可能会看到互斥锁已被放弃(WaitForSingleObject返回WAIT_ABANDONED),并获得所有权。

我为没有提供解决方案而道歉,但我希望它能回答你关于为什么两种系统的行为不同的问题。

  1. 顺便说一句,使用注册表项获取这些信息是可怕的--使用SHGetKnownFolderPath更安全,也更可靠。但我离题了。
  2. 取决于您的操作系统版本,可以是%ALLUSERSPROFILE%\Application Data\boost.interprocessProgramData\boost.interprocess,也可以完全是其他地方。
票数 9
EN

Stack Overflow用户

发布于 2013-12-04 17:25:46

您想要的不是琐碎的,interprocess_mutex肯定是错误的。

您可以做的是在终止时删除互斥,方法是提供一个清除器析构函数和/或在catch(.)中。但是这并不能保证工作,因为如果您直接(从OS)终止进程,这是不可能完成的。而且,当应用程序启动两次时,它可能会意外地删除互斥对象。

一种方法是在程序第一次启动时(例如在共享内存中)安全进程id,并在程序停止时删除它。每次启动应用程序时,读取并检查id是否仍在处理中,如果没有,则启动程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20379817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档