c++ - 检测多线程 C++ 应用程序中的阻塞调用
问题描述
在 C++ 应用程序中,我有来自同一类的2 个线程(thread1
和)。thread2
他们正在非常快速地运行一个循环,并且不会在循环内进行任何阻塞调用:
while (!end) {
//dostuff, no blocking!
}
cout << "ended" << endl;
应用程序中存在一些错误,因为当我一次只运行一个线程并设置其end
属性时,它可以成功退出循环。
但是,如果我同时运行两个线程,有时其中一个线程无法脱离循环(尽管end
设置了它的属性)。
循环本身很大(几百行),我可以在其中放置一个(条件)断点,但是当我单步执行时,我失去了功能(因为线程应该运行得很快),所以即使我找到了哪一行块,这可能是错误的方式。
所以,我的问题是:gdb 中是否有任何选项可以让断点表现得像看门狗?即:如果在一定时间内它不会被击中,它应该会破坏线程,所以我可以检查哪一行导致了麻烦。
解决方案
即:如果在一定时间内它不会被击中,它应该会破坏线程,所以我可以检查哪一行导致了麻烦。
您不需要此功能来检查哪条线路导致问题(并且该功能不存在)。
等待“不退出”情况发生,然后按 Control-C。GDB 将停止该进程的所有线程,并给出(gdb)
提示。此时,发出thread apply all where
命令,您将看到“未退出”线程卡住的位置。
推荐阅读
- pdf - ghostscript:将 PDF 转换为灰色,为文本保留纯黑色
- amazon-web-services - 删除查询使我的表越来越大
- angular - 使用 router.navigate 从上一页导航时未调用 ngOnInit 和 Constructor
- php - 在 Salesforce Lightning API curl/php 中创建记录
- c# - 如何加载现有页面?
- javascript - 使用多个 json 数组按日期对 Json 排序并显示结果
- c# - 如果存储库层发生异常,则从 catch 块返回语句?
- python - 使用 python、selenium、chrome-driver 获取所有页面源,不仅是类
- logging - 空手道:有没有办法在使用重试时禁用日志?
- excel - 将不同工作表中的值相加并在同一单元格上返回结果