可连接std :: thread的析构函数

时间:2014-09-18 11:41:56

标签: multithreading c++11 g++

规范(? - 从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 ++不仅符合这个规范吗?

1 个答案:

答案 0 :(得分:2)

您可能需要thread_ptr.reset()而不是thread_ptr.release()release()放弃指针的所有权,即泄漏std::thread实例,因此从不调用它的析构函数。