C++ 互斥可以挂起执行吗?
我还没有认真使用互斥体 在不同的地方实现了一些互斥后,我意识到程序执行挂起(而不是退出)。 我试图调试它(在eclipse环境中),但我无法找到确切的原因(或者至少我不知道如何找到原因) 但是,我现在知道,当程序在几次迭代后试图在同一位置成功锁定时,程序会挂起 以下是一些代码:C++ 互斥可以挂起执行吗?,c++,locking,deadlock,boost-mutex,C++,Locking,Deadlock,Boost Mutex,我还没有认真使用互斥体 在不同的地方实现了一些互斥后,我意识到程序执行挂起(而不是退出)。 我试图调试它(在eclipse环境中),但我无法找到确切的原因(或者至少我不知道如何找到原因) 但是,我现在知道,当程序在几次迭代后试图在同一位置成功锁定时,程序会挂起 以下是一些代码: void xxx::receiveModule(timeslice now) { //check if you have received anything in the incoming buffer
void xxx::receiveModule(timeslice now)
{
//check if you have received anything in the incoming buffer
if(!isIncomingDirty())// <- has a mutex inside
{
return;
}
//...
}
bool &yyy::isIncomingDirty() {
boost::unique_lock< boost::shared_mutex > lock(*Communicator_Mutexes[2]));//<-this will cause hang after a few calls
return incomingIsDirty;
}
void xxx::receiveModule(现在是时间片)
{
//检查传入缓冲区中是否接收到任何内容
if(!isIncomingDirty())//lock(*Communicator_mutex[2]);//谢谢大家的评论。
正如您所看到的,问题是广泛的,这个问题可能是由您所说的许多原因中的任何一个引起的。对于我来说,是递归锁定
导致了死锁
一种解决方案是使用boost::recursive_mutex
。但是,当我可以选择第二种解决方案时,为什么要使用它呢:首先要避免递归锁定
我就是这么做的,所以问题就解决了
再次感谢死锁通常会导致挂起,因为某些或所有线程/进程/etc无法取得任何进一步的进展,无法执行。@rahman是通信器\u互斥体[2]锁定在其他地方?这就是我试图手动查找的东西,但还没有找到运气。有没有建议使用监视器之类的东西来查找它?死锁至少需要两个互斥体,比如a和B,线程1持有a并等待B,线程2持有B并等待a。任何“叶”互斥体(总是最后使用)或“根”互斥体(总是先取)因此免于死锁。snipper是否显示为唯一的代码锁定Communicator\u mutex[2]
?如果是,则它是叶锁(之后return
语句不会锁定任何内容)也不是死锁的原因。在这里,返回对bool的引用可能不是最好的方法,因为调用方可能使用引用而不锁定相应的互斥锁。虽然这可能不是死锁的来源,但仍可能损坏应用程序的行为。