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写入系统,我怀疑它没有显式调用就被删除,即使程序结束.
有人帮忙吗?
解决方法
如果显式调用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().