删除 std::线程指针会引发异常"libc++abi.dylib: terminating"

Deleting std::thread pointer raises exception "libc++abi.dylib: terminating"

本文关键字:异常 libc++abi dylib terminating std 线程 指针 删除      更新时间:2023-10-16

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

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

然后我试图删除它。

delete th;

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

libc++abi.dylib: terminating
Abort trap: 6

您创建的线程是joinable,除非您将其joindetach,否则在执行线程对象的析构函数时将调用std::terminate。所以你需要

th->join();
delete th;

std::thread的早期建议隐式地在析构函数中使用detach,但是当拥有thread实例的线程在创建和join之间抛出异常时,发现这会导致问题。N2802包含变更建议以及说明性示例。

最初的行为是从boost::thread继承过来的,但它也在析构函数中弃用了隐式detach


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