2

我对认真使用互斥锁还很陌生。

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

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

4

1 回答 1

1

谢谢大家的友好评论。如您所见,问题很广泛,问题可能是由您所说的许多原因引起的。就我而言,正是recursive locking这导致了僵局。

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

再次感谢

于 2013-04-23T10:46:46.763 回答