我有一个可以由多个线程创建的类。但在一个函数中,代码需要受到保护,因此我决定使用 boost 进程间互斥体。每个类在其构造函数中创建或打开相同的互斥体:
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 页面上描述的那样),我在类析构函数中使用了删除命令:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
实际上所有这些代码都工作正常,但我有一个问题:
正如删除命令的描述中所述:
从系统中删除指定的互斥体。出错时返回 false。从不抛出。
因此,这意味着删除命令只是将互斥锁从系统中删除 - 即使另一个线程刚刚锁定了它(我已经尝试过这种情况 - 它不再被锁定)。
所以我的问题如下:
例如,我有 3 个线程( A、B 和 C ) - 现在会发生以下情况:
- 进程A创建该类的实例,调用该函数并锁定它
- 进程 B 创建该类的实例,调用该函数但无法访问代码(然后等待,例如)
- 进程 A 完成受保护的代码并解锁
- 进程 B 获得对受保护代码的访问权限并将其锁定
- 进程A删除类的实例->调用remove命令
- 进程 C 创建类的实例,调用函数并可以访问代码,因为删除命令删除了互斥体 --> 错误!
所以现在有人可能会说“那就不要调用删除!” - 那么这可能吗?我的意思是,由于named_mutex写入系统,我怀疑它会在没有显式调用的情况下被删除,即使程序结束也是如此。
有人有帮助吗?
来自增强文档, the remove
打电话,是不必要的。的析构函数named_mutex
将自动向操作系统表明该进程不再需要该资源。您可能只需要依靠析构函数的内置行为进行清理就可以了。
如果显式调用remove,则可能会导致尝试使用指定互斥体的任何其他进程或线程对该互斥体的任何操作失败。根据您的使用安排方式,这可能会导致数据争用或在其他进程中引发崩溃/异常。
〜named_mutex();
销毁*this并表明调用过程完成
使用该资源。析构函数将释放任何系统
系统为此进程分配的资源
资源。资源仍然可以通过调用 open 再次打开
构造函数重载。要从系统中删除资源,请使用
消除()。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)