【发布时间】:2019-09-13 05:17:09
【问题描述】:
我有几个进程,但当时只有一个应该在运行。这意味着假设 Process1 正在运行,如果 Process2 启动,那么 Process2 应该等到 Process1做完了。为此,我正在考虑 boost named_mutex。为了避免在抛出某些异常时互斥锁可能不会被释放的情况,看起来 boost::lock_guard 可能很有用。我想出了以下代码的简化版本。
#include <iostream>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/thread.hpp>
#include <chrono>
#include <thread>
using namespace boost::interprocess;
#pragma warning(disable: 4996)
int main()
{
std::cout << "Before taking lock" << std::endl;
named_mutex mutex(open_or_create, "some_name");
boost::lock_guard<named_mutex> guard(mutex) ;
// Some work that is simulated by sleep
std::cout << "now wait for 10 second" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "Hello World";
}
到目前为止,一切都很好。当这个程序运行时,我点击了 Ctl+C,所以程序被中止(模拟程序崩溃、未处理的异常等)。之后,当我运行应用程序时,程序会挂在下面的代码行中。
named_mutex mutex(open_or_create, "some_name");
boost::lock_guard<named_mutex> guard(mutex) ;
如果我更改互斥锁名称,那么它可以正常工作而不会挂起。但是,看起来名为 some_name 的互斥体在某种不良状态下以某种方式在机器上“记住”了。这会导致任何尝试获取名为 some_name 的互斥锁的应用程序都会挂在这行代码上。如果我将此互斥体名称更改为 some_name2,程序将再次正常工作。
- 谁能解释一下导致这种行为的原因?
- 如何重置此特定互斥体的行为?
- 最重要的是,如何在实际应用中避免这种情况?
【问题讨论】:
-
它正在文件系统的某处保存状态。见stackoverflow.com/q/20379817/398091
标签: c++ windows visual-studio boost mutex