在 Windows 上挂起的提升named_mutex问题

Problem with boost named_mutex hanging on Windows

提问人:David Partridge 提问时间:11/14/2023 更新时间:11/14/2023 访问量:14

问:

我有一个用户报告说,我的应用程序的 main() 中的以下代码 除非他使用“以管理员身份运行”,否则挂起:

       ZTRACE_RUNTIME("Checking Mutex");
       bip::named_mutex dssMutex{ bip::open_or_create,
"DeepSkyStacker.Mutex.UniqueID.12354687" };
       bip::scoped_lock<bip::named_mutex> lk(dssMutex, bip::defer_lock);
       const bool firstInstance{ lk.try_lock() };
       ZTRACE_RUNTIME(" firstInstance: %s", firstInstance ? "true" :
"false");

跟踪显示“正在检查互斥锁”,然后全部停止。

我的代码是否错误,如果有,我需要更改什么?如果没有,我该怎么办 确定问题出在哪里?

关于相关问题:我认为这是 C++ 异常安全的,因为互斥锁 将被解锁和删除。

但是,如果发生 C 异常,那么我应该如何清理?

重新启动后named_mutex是否持续存在?如果是这样,它在哪里举行(在 如果我需要进行手动清理)。

非常感谢 大卫

提高

评论


答:

0赞 sehe 11/14/2023 #1

错误不在于代码,而在于进程终止的方式。如果你杀死它们或它们崩溃,它们可能会无限期地“持有”锁,即使在终止后也是如此。

没有真正的解决方案,因为没有(可移植的)健壮的命名互斥锁

请注意,在 Windows 上,我似乎记得该实现是为了检测在获取最后一个锁后何时重新启动,这会为您打破锁定。因此,重新启动将始终有效。

在实践中,我建议使用超时(例如timed_locktry_lock_until)。然后向用户提供反馈。若要强制放弃锁定,可以使用显式命令行选项,供知道自己在做什么的应用程序管理员使用。try_lock