【发布时间】:2019-09-10 17:47:50
【问题描述】:
我有几个进程,但当时只有一个应该在运行。这意味着假设 Process1 正在运行,如果 Process2 启动,那么 Process2 应该等到 Process1做完了。我正在考虑使用如下代码为此boost named_mutex。
#include <iostream>
#include <boost/interprocess/sync/named_mutex.hpp>
using namespace boost::interprocess;
int main()
{
named_mutex mutex(open_or_create, "some_name");
try
{
mutex.lock();
// Do work
mutex.unlock();
}
catch (const std::exception& ex)
{
mutex.unlock();
std::cout << ex.what();
}
}
问题:
1. 如果Process1 遇到任何已处理/未处理的异常,我想确保不会出现Process2 饿死获取锁的情况?
2. C++ 中是否有任何类似 C# 的 finally 机制可以在这个用例中有所帮助?
【问题讨论】:
-
如果 process1 终止 - 进程中的所有线程都终止,包括拥有互斥锁的线程。结果互斥锁将被释放,下一个服务员(比如 process2 线程)成为新的所有者 - 开始运行。但是如果 process1 挂起而不是终止而不是在挂起之前直接释放互斥锁 - 当然另一个进程将无限等待
-
好点,我猜使用 mutex.time_lock() 将解决挂起的情况?
-
不,挂起的场景没有任何解决方案。从某种意义上说,您当然可以等待互斥锁不是无限的,而只能等待一段时间,但是如果等待超时完成,接下来您将做什么?只退出进程
-
Hmmmm... 超时时间后锁会被释放吗?那么 Process2 应该可以继续了吗?
-
当然你可以在 mutex 上等待有限的时间,之后你可以继续运行。但互斥锁将由第一个挂起的线程拥有。所以在这种情况下,几个进程将同时运行,这是您想要避免的。互斥体,如果它的所有者挂起,当然永远不会被释放
标签: c++ visual-studio boost mutex boost-interprocess