std::thread.join() deadlock
std::thread.join() deadlock
我不明白为什么这个简单的代码片段有一个死锁:
#include <atomic>
#include <thread>
#include <memory>
using namespace std;
class Test {
public:
Test() : mExit( false )
{
mThread = thread( bind( &Test::func, this ) );
}
~Test()
{
if ( mThread.joinable() )
{
mExit = true;
mThread.join();
}
}
private:
void func()
{
while ( !mExit )
{
// do something
}
}
private:
atomic< bool > mExit;
thread mThread;
};
typedef unique_ptr< Test > TestPtr;
TestPtr gTest;
int main()
{
gTest = TestPtr( new Test );
return 0;
}
编辑我输入了错误的构造函数设置mExit = true
Edit 2 我正在使用msvc2012与v110_xp工具集。
编辑3 如果我在main
我刚刚遇到了这个问题,所以我把真实的答案贴出来给别人。
至少在visual studio中,有一个"退出锁",当线程进入退出代码时,它被锁定。main()
后为主线程,f()
后为std::thread(f)
)。
由于您的Test类仅在main()
完成后才被销毁,因此"退出锁"被锁定。只有设置了mExit = true;
,另一个线程才被允许完成。另一个线程等待获得主线程已经获得的"退出锁",而主线程在mThread.join();
中等待导致死锁。
所以,是的,你需要在主线程完成之前连接所有的线程。
对我来说,代码看起来不错,如果它可以与局部dut和全局我怀疑类相关的deinit序列。连接发生在出口深处,实现可能已经消除了一些结构。这不应该是这样,但却是可能的。
在任何情况下,我总是避免在main之前启动线程,并留下任何到达main的结束。我认为那是自找麻烦。如果你能重新安排它,在稍早一点的时候强制连接,整个问题可能会消失。
还应该在atomic上使用atomic_flag
修改代码
gTest = TestPtr(new Test);
auto gTest = std::make_unique();
解决问题。
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- join() 失败,如果在线程内部调用 io_context.run()
- std::future::get()或std::future::wait()是std::thread::join()的替
- 是"deadlock"吗?如何在多线程中避免它?
- c++17 std::thread join() : 没有这样的进程
- std::thread::join() 可以从非父线程调用吗?
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- 为什么在线程销毁之前必须调用 join() 或 detach()
- thread.join() 的工作原理
- 有没有办法在C++中实现 Python 的 join()?
- 使用Boost :: Join合并多个阵列
- 寻找 std::join 行为的澄清
- OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- 使用 Ranges-v3 视图::join保留双向性
- 在我调用join()之前,std ::线程运行
- 线程:join上是否存在具有synchronized with relationship的隐式内存障碍
- 线程已退出,代码为 1:Join() 和 Detach()
- C++/pthread/join 错误消息的含义 "what(): Invalid argument"
- std::thread.join() deadlock