提升了named_mutex和remove()命令

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) - 现在发生以下情况:

  1. 进程A创建类的实例,调用函数并锁定它
  2. 进程B创建类的实例,调用函数但无法访问代码(然后等待例如)
  3. 进程A完成受保护的代码并解锁
  4. 进程B获得对受保护代码的访问权并锁定它
  5. 进程A删除类的实例 - >调用remove命令
  6. 进程C创建类的实例,调用函数并可以访问代码,因为remove命令删除了Mutex - > Error!

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

Nat*_*nst 6

提升文档中,remove调用是不必要的.析构函数named_mutex将自动注意向OS指示该进程不再需要该资源.只需依靠析构函数的内置行为进行清理,你就可以了.

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

〜named_mutex();

销毁*this并指示使用资源完成调用过程.析构函数将释放系统分配的任何系统资源,供此资源使用此进程.仍然可以再次打开资源,调用open构造函数重载.要从系统中擦除资源,请使用remove().

  • 好吧,昨天我做了一点点研究和试错.互斥锁的资源位于共享内存(/ dev/shm /)中.创建它之后,它将一直保持在那里,直到你调用remove()或系统重新启动.(或者你做任何其他事情来清除共享内存,例如自己擦除它).对象本身包含有关它是否被锁定的信息.当互斥锁被破坏时,它会被解锁但不会被删除!因此,唯一的问题可能是程序崩溃并且无法调用析构函数并且对象保持锁定状态. (11认同)