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

时间:2014-11-09 09:27:02

标签: c++ multithreading visual-c++

当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;
}

我有nativate pthread_create函数的经验,但似乎缺少某些东西。当我把睡眠(15000);在ThreadProc方法中,同样的问题没有任何变化。

1 个答案:

答案 0 :(得分:7)

std::thread的{​​{3}}中记录了这一点:如果某个线程在可加入时被销毁,则会调用std::terminate

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

  

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

您必须加入线程或分离它。在您的案例中,加入似乎是正确的选择。