提问人:David Partridge 提问时间:11/14/2023 更新时间:11/14/2023 访问量:14
在 Windows 上挂起的提升named_mutex问题
Problem with boost named_mutex hanging on Windows
问:
我有一个用户报告说,我的应用程序的 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_lock
或try_lock_until
等)。然后向用户提供反馈。若要强制放弃锁定,可以使用显式命令行选项,供知道自己在做什么的应用程序管理员使用。try_lock
评论