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

佐斯卡

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

〜thread(); (自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启动线程:

主仍然活着!

我正在使用g ++:线程模型:posix,gcc版本4.8.1(Ubuntu 4.8.1-2ubuntu1〜12.04)

我对规格有误解吗?错误代码?还是g ++不仅符合该规范?

Angew不再为SO感到骄傲

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

销毁删除仍然需要析构函数可访问吗?

在Visual Studio中,当与std :: async一起使用时,不会调用“ thread_local”变量析构函数,这是一个错误吗?

std :: list <std :: future>析构函数不会阻止

std :: move意外调用析构函数

使用析构函数进行线程连接

std :: list的擦除成员函数是否为所有存储的元素调用析构函数?

std :: remove_if是否调用析构函数?

Boost.Asio套接字析构函数关闭连接?

未实现的临时临时文件需要析构函数可访问吗?

std :: is_nothrow_move_constructible是否需要一个noexcept析构函数?

Qt小部件析构函数通过连接的信号间接调用小部件方法,并崩溃

std :: unique_ptr析构函数构造函数顺序

无法手动调用std :: string的析构函数

什么时候调用std :: thread析构函数?

从对象原因到此类的调用析构函数的c ++ std :: thread调用方法

QT应用在Android 10设备上的std :: thread的析构函数处崩溃

std :: vector析构函数中的分段错误

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

为什么std :: vector的构造函数调用自定义类的析构函数?

为什么从`std :: async`阻塞返回的是将来的析构函数?

thread_local std :: unique_ptr版本未调用析构函数

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

std :: thread在vc ++中的析构函数中获取中止异常

在std :: swap中进行有害的析构函数调用

std :: map <struct,int>我需要析构函数吗?

如何显式调用 std 迭代器的析构函数?

如何允许 std::unique_ptr 访问类的私有析构函数或使用私有析构函数实现 C++ 工厂类?

删除析构函数的类被认为是可简单复制的?

std::map 对象析构函数被调用?