【发布时间】:2011-09-26 12:43:44
【问题描述】:
我有一个可以由多个线程创建的类。但是在一个函数中,代码需要受到保护,所以我决定使用 boost 进程间互斥锁。每个类都在其构造函数中创建或打开相同的 Mutex:
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock" );
}
所以现在到了关键代码部分的调用点:
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
要在函数之后进行清理(就像在 boost 页面上描述的那样),我在我的类析构函数中使用了 remove 命令:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
实际上所有这些代码都可以正常工作,但我有一个担忧:
正如删除命令的描述中所说:
从系统中删除一个命名的互斥体。出错时返回 false。从不扔。
所以这意味着 remove 命令只是将 Mutex 从系统中删除 - 即使另一个线程刚刚锁定它(我已经尝试过这种情况 - 它不再被锁定)。 所以我的问题如下: 例如,我有 3 个线程( A、B 和 C ) - 现在发生以下情况:
- 进程 A 创建类的实例,调用函数并锁定它
- 进程 B 创建类的实例,调用函数但无法访问代码(然后等待例如)
- 进程 A 使用受保护的代码完成并解锁
- 进程 B 获得对受保护代码的访问权并将其锁定
- 进程 A 删除类的实例 -> 调用删除命令
- 进程 C 创建类的实例,调用函数并可以访问代码,因为删除命令删除了互斥锁 --> 错误!
所以现在有人可能会说“那么不要调用 remove!” - 这可能吗?我的意思是,由于 named_mutex 写入系统,我怀疑它在没有显式调用的情况下被删除,即使程序结束。 有人帮忙吗?
【问题讨论】:
-
我对您的问题以及术语“线程”和“进程”的相互使用感到困惑。你在处理哪个?线程?还是流程?如果您只是在单个进程中使用多线程,则命名的 mutice 通常具有极其微不足道的效用。
-
您对此感到抱歉 - 我只是在写作时有点困惑。其实我有不同的过程。正如您所说,只有线程实际上不需要命名互斥锁。
标签: c++ boost locking mutex interprocess