我非常认真地使用互斥锁。
在不同的地方实现了几个互斥,我意识到程序执行挂起(而不是退出)。 我尝试调试它(在eclipse环境中)但我无法达到一个明确的原因(或者至少我不知道如何找到一个) 但是,我知道现在程序在尝试在几次迭代之后进行锁定时会挂起,从而成功锁定在同一位置。
这里有一些代码:
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;
}
我不知道死锁在发生时会显示什么行为。 1 - 这是一个僵局吗?
2 - 你会在哪里检查原因?
3可以递归锁定或嵌套锁定同一个互斥导致这种情况吗?
这个可能不在话题:
4-I交换类之间的互斥锁,以便在不同的线程中使用它们的方法。这是一种常见的做法吗?这样的事情是允许的吗?
非常感谢您的意见和解决方案
答案 0 :(得分:1)
感谢大家的好评。
如您所见,问题很广泛,问题可能是由您提出的众多原因造成的。就我而言,recursive locking
造成了僵局。
一种解决方案是使用boost::recursive_mutex
。但是,当我可以选择第二个解决方案时,为什么要使用它:首先避免递归锁定
这就是我所做的,因此解决了问题。
再次感谢