可以互斥挂起执行

can mutex hang execution?

本文关键字:挂起 执行      更新时间:2023-10-16

对于互斥锁的使用我还是个新手。

在不同的地方实现了一些互斥之后,我意识到程序执行挂起了(而不是退出)。我试着调试它(在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;
    }

我不知道死锁发生时会显示什么行为。这是僵局吗?

2-你会检查哪里来寻找原因?

3—同一互斥锁的递归锁或嵌套锁会导致这种情况吗?

这个可能跑题了:

4-I在类之间交换互斥锁,以供不同线程在其方法中使用。这是常见的做法吗?允许这样做吗?

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

感谢大家的评论。正如你所看到的,这个问题很广泛,问题可能是由你所说的许多原因中的任何一个引起的。对于我的例子,是recursive locking导致了死锁。

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

再次感谢