Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 互斥可以挂起执行吗?_C++_Locking_Deadlock_Boost Mutex - Fatal编程技术网

C++ 互斥可以挂起执行吗?

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

我还没有认真使用互斥体

在不同的地方实现了一些互斥后,我意识到程序执行挂起(而不是退出)。 我试图调试它(在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;
    }
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的引用可能不是最好的方法,因为调用方可能使用引用而不锁定相应的互斥锁。虽然这可能不是死锁的来源,但仍可能损坏应用程序的行为。