显式调用~boost::lock\u guard<&燃气轮机;导致互斥锁死锁

显式调用~boost::lock\u guard<&燃气轮机;导致互斥锁死锁,boost,mutex,Boost,Mutex,如果这是一个错误,我没有问题,只是不这样做,但如果这是一个预期的行为,我想知道为什么 我是这样做的: { boost::lock_guard<boost::mutex> lg(tagsToSocketsMtx); // mutex protected work lg.~lock_guard(); // this causes deadlocks later(combined with ... //...other uses of the same mtx, ofc

如果这是一个错误,我没有问题,只是不这样做,但如果这是一个预期的行为,我想知道为什么

我是这样做的:

{
   boost::lock_guard<boost::mutex> lg(tagsToSocketsMtx);
// mutex protected work 
   lg.~lock_guard(); // this causes deadlocks later(combined with ...
  //...other uses of the same mtx, ofc I use different lock guard in other functions)

// rest of the function
}
{
增压:锁紧保护lg(tagsToSocketsMtx);
//互斥保护工作
lg.~lock_guard();//这会在以后导致死锁(与。。。
//…相同mtx、ofc的其他用途(我在其他功能中使用不同的锁紧装置)
//函数的其余部分
}

<代码> > p>一旦完成了<代码> LG,C++就保证了它的析构函数将被调用在作用域出口上,而不管你是否也在做显式析构函数调用。
通过两次销毁lg,您正在调用未定义的行为,在这种情况下,bug表现为死锁。

哎哟。。。我以为这只是移动了destruction-fwd,但现在当我考虑它时,通常无法确定是否将调用显式析构函数(如果它在if语句中)。。。所以是的,我很愚蠢。。。BTW为什么C++允许显式调用DROTS?这似乎是个可怕的主意。delete可以被赋予特殊的权限以便调用dtor,但用户不能?@nosenseal:显式析构函数调用(与placement new配对时)的一个典型用法是将对象生存期与内存分配分开。tnx,如果有人想知道我为什么会犯这样愚蠢的错误。。。我记得我使用了一个类似的类,我想是C++11,由于性能原因,它有一个unlock方法,所以当我没有找到它时,我显式地调用了析构函数:/“破坏lg两次,就是在调用未定义的行为”,你确定吗?使用锁防护肯定不是我们想要的方式,但我认为从技术上讲,多次调用析构函数(而不是删除)并不是UB。@enobayram:是的,但更有用的结果是,析构函数不必以多个调用都是安全的方式编写。