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

Posted

技术标签:

【中文标题】可连接 std::thread 的析构函数【英文标题】:Destructor of a joinable std::thread 【发布时间】:2014-11-12 17:44:11 【问题描述】:

规范(? - 从 cppreference 获得)指出:

~线程(); (C++11 起)

销毁线程对象。如果 *this 仍有关联的正在运行的线程 (即 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++ 不仅仅符合这个规范?

【问题讨论】:

while(1) 是 UB BTW。 【参考方案1】:

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

【讨论】:

很好看。随着这种变化,整个程序中止(至少在 Clang 中)。

以上是关于可连接 std::thread 的析构函数的主要内容,如果未能解决你的问题,请参考以下文章

std::thread,类构造函数和析构函数

mfc 类的析构函数

使用链接的哈希表的析构函数

C++ 设置基类的析构函数为虚函数

基类的析构函数写成virtual虚析构函数

虚析构函数