规范(? - 从cppreference得到它)声明:
〜螺纹(); (自C ++ 11起)
销毁线程对象。如果*仍然有一个关联的运行线程 (即joinable()== true),调用std :: terminate()。
我已经检查过在线程内调用std::terminate()
会中止整个程序。
因此,为了检查析构函数行为,我编写了这段代码:
#include <iostream>
#include <thread>
#include <memory>
int main() {
std::unique_ptr<std::thread> thread_ptr(new std::thread([](){
std::cout << "Starting thread: " << std::endl;
while(1) {}
}));
while(!thread_ptr->joinable()){}
std::cout << thread_ptr->joinable() << std::endl;
thread_ptr.release();
std::cout << "Main is still alive!" << std::endl;
return 0;
}
期待整个过程的中止。
没有发生这样的事情,所有输出都是消息的排列,例如:
1开始线程:
Main还活着!
我正在使用g ++:线程模型:posix,gcc版本4.8.1(Ubuntu 4.8.1-2ubuntu1~12.04)
我对规格有错误的理解吗?错误的代码?或者g ++不仅符合这个规范吗?
答案 0 :(得分:2)
您可能需要thread_ptr.reset()
而不是thread_ptr.release()
。 release()
放弃指针的所有权,即泄漏std::thread
实例,因此从不调用它的析构函数。