c – 提升named_mutex和remove()命令

前端之家收集整理的这篇文章主要介绍了c – 提升named_mutex和remove()命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用boost interprocess互斥.每个类在其构造函数中创建或打开相同的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");
}

实际上所有这些代码都运行良好,但我有一个问题:

正如在remove命令的描述中所说:

Erases a named mutex from the system. Returns false on error. Never throws.

所以这意味着删除命令只是将Mutex清除出系统 – 即使另一个线程刚刚锁定它(我已经尝试过这种情况 – 它不再被锁定了).
所以我的问题如下:
例如,我有3个线程(A,B和C) – 现在发生以下情况:

>进程A创建类的实例,调用函数并锁定它
>进程B创建类的实例,调用函数但无法访问代码(然后等待)
>进程A使用受保护的代码完成并解锁
>进程B获得对受保护代码的访问权并锁定它
>进程A删除类的实例 – >调用remove命令
>进程C创建类的实例,调用函数并可以访问代码,因为remove命令删除了Mutex – >错误

所以现在有人可能会说“那就不要打电话了!” – 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它没有显式调用就被删除,即使程序结束.
有人帮忙吗?

解决方法

boost docs开始,删除呼叫是不必要的. named_mutex的析构函数自动注意向OS指示该进程不再需要该资源.只需依靠析构函数的内置行为进行清理,你就可以了.

如果显式调用remove,则可能会导致尝试使用指定互斥锁的任何其他进程或线程对互斥锁上的任何操作失败.根据您的使用方式的编排,这可能会导致数据争用或在其他进程中抛出崩溃/异常.

~named_mutex();

Destroys *this and indicates that the calling process is finished using the resource. The destructor function will deallocate any system resources allocated by the system for use by this process for this resource. The resource can still be opened again calling the open constructor overload. To erase the resource from the system use remove().

猜你在找的C&C++相关文章