mutex可以挂起执行吗?

时间:2013-04-16 09:45:01

标签: c++ locking deadlock boost-mutex

我非常认真地使用互斥锁。

在不同的地方实现了几个互斥,我意识到程序执行挂起(而不是退出)。 我尝试调试它(在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交换类之间的互斥锁,以便在不同的线程中使用它们的方法。这是一种常见的做法吗?这样的事情是允许的吗?

非常感谢您的意见和解决方案

1 个答案:

答案 0 :(得分:1)

感谢大家的好评。 如您所见,问题很广泛,问题可能是由您提出的众多原因造成的。就我而言,recursive locking造成了僵局。

一种解决方案是使用boost::recursive_mutex。但是,当我可以选择第二个解决方案时,为什么要使用它:首先避免递归锁定
这就是我所做的,因此解决了问题。

再次感谢