Tob*_*oby 8 c++ boost mutex locking interprocess
我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用boost interprocess互斥.每个类在其构造函数中创建或打开相同的Mutex:
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock" );
}
Run Code Online (Sandbox Code Playgroud)
所以现在有一个关键代码部分被调用的地方:
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
}
Run Code Online (Sandbox Code Playgroud)
要在函数后清理(和它在boost页面上描述的那样),我在我的类析构函数中使用remove命令:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
Run Code Online (Sandbox Code Playgroud)
实际上所有这些代码都运行良好,但我有一个问题:
正如在remove命令的描述中所说:
从系统中删除命名的互斥锁.错误时返回false.永远不要扔.
所以这意味着删除命令只是将Mutex清除出系统 - 即使另一个线程刚刚锁定它(我已经尝试过这种情况 - 它已经不再被锁定了).所以我的问题如下:例如我有3个线程(A,B和C) - 现在发生以下情况:
所以现在有人可能会说"那就不要打电话了!" - 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它是否在没有显式调用的情况下被删除,即使程序结束.有人帮忙吗?
从提升文档中,remove
调用是不必要的.析构函数named_mutex
将自动注意向OS指示该进程不再需要该资源.只需依靠析构函数的内置行为进行清理,你就可以了.
如果显式调用remove,则可能会导致尝试使用指定的互斥锁的任何其他进程或线程在互斥锁上的任何操作上失败.根据您的使用方式的编排,这可能会导致数据争用或在其他进程中抛出崩溃/异常.
〜named_mutex();
销毁*this并指示使用资源完成调用过程.析构函数将释放系统分配的任何系统资源,供此资源使用此进程.仍然可以再次打开资源,调用open构造函数重载.要从系统中擦除资源,请使用remove().