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

Posted

技术标签:

【中文标题】std::thread 在 vc++ 的析构函数中获取中止异常【英文标题】:std::thread get abort exception in destructor in vc++ 【发布时间】:2014-11-09 09:27:01 【问题描述】:

当 main 方法完成时,我在简单的 VC++ 程序中遇到异常终止。

这是我的示例测试程序。

#include "stdafx.h"
#include <thread>
#include <Windows.h>

class ThreadTest

public:
    ThreadTest()
    
    

    ~ThreadTest()
    

    

    void ThreadProc()
    

    
;

int _tmain(int argc, _TCHAR* argv[])

    ThreadTest test;
    std::thread t = std::thread(&ThreadTest::ThreadProc, std::ref(test));

    Sleep(5000);

    return 0;

我有原生 pthread_create 函数的经验,但似乎缺少一些东西。当我把 Sleep(15000);在 ThreadProc 方法中发生同样的问题,没有任何更改。

【问题讨论】:

【参考方案1】:

这在std::thread 的destructor 中有记录:如果线程在可连接时被销毁,则调用std::terminate

引自 C++11 标准草案 n3290(§30.3.1.3 线程析构函数):

如果joinable()terminate(),否则无效。 [ 注意:在其析构函数中隐式分离或加入 joinable() 线程可能导致难以调试正确性(分离)或性能(加入)错误,仅在引发异常时遇到。因此,程序员必须确保在线程仍可连接时永远不会执行析构函数。 ——尾注]

您必须加入线程或分离线程。在您的情况下,加入似乎是正确的选择。

【讨论】:

在 C++20 中 jthread 可用于在销毁时自动加入。

以上是关于std::thread 在 vc++ 的析构函数中获取中止异常的主要内容,如果未能解决你的问题,请参考以下文章

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

vc9 和 gcc 之间的不同析构函数行为

从 C++ 中的析构函数中恢复对象?

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

在 C# 中,类中的析构函数和 Finalize 方法有啥区别?

在类的析构函数中删除数组