可以互斥挂起执行
can mutex hang execution?
对于互斥锁的使用我还是个新手。
在不同的地方实现了一些互斥之后,我意识到程序执行挂起了(而不是退出)。我试着调试它(在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
。但是,当我可以选择第二个解决方案时,为什么要使用它呢? 首先避免递归锁定
这就是我所做的,因此问题解决了。
再次感谢
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 当一个线程希望执行或打印某个内容时,如何挂起其他线程
- 在 dll 中执行 GetWindowText() 时挂起
- OpenMP - 在执行期间挂起
- 字符串输入超过1000个字符时执行挂起
- 大型可执行文件会导致调试器挂起
- mingw32:所有编译的可执行文件都挂起
- 程序在每次执行查询时挂起
- 如何在停止io_service之前等待所有挂起的完成处理程序被执行
- 将字符串映射到整型CPP -输出在执行期间挂起
- 可以互斥挂起执行