删除std :: thread指针会引发异常"libc ++ abi.dylib:terminate"

Str*_*rin 4 c++ multithreading c++11 stdthread

在Mac OS X上使用LLVM 6.0的C++ 11中,我首先创建了一个指向std :: thread内存分配的指针.

std::thread* th = new std::thread([&] (int tid) {
    // do nothing.
}, 0);
Run Code Online (Sandbox Code Playgroud)

然后我试着删除它.

delete th;
Run Code Online (Sandbox Code Playgroud)

但是,编译上面的代码并执行它会引发异常

libc++abi.dylib: terminating
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 15

您创建的线程是joinable,除非您join或detach它在线程对象std::terminate的析构函数执行时被调用.所以你需要

th->join();
delete th;
Run Code Online (Sandbox Code Playgroud)

早期的建议std::thread隐含detach编在析构函数的线程,但这个发现当拥有线程扔创作之间的异常导致问题join一的ING thread实例.N2802包含更改提议以及说明性示例.

最初的行为是从结构中转移出来的,boost::thread但它也已经在析构函数中隐式弃用detach了.


与您的问题无关,但您不太可能需要动态分配线程对象,即使您这样做,也应该将其存储在unique_ptr.

  • @Strin它不需要是可复制的.`std :: vector`只能处理移动类型,`std :: thread`是可移动的.至于要求用户调用`join`或`detach`,IIRC原始的`std :: thread`提案的析构函数确实做到了这一点,但它被发现是有问题的.让我试着挖掘改变的原因. (4认同)