在c ++类中运行一个线程

时间:2014-09-25 14:26:23

标签: c++ multithreading c++11

我希望创建一个具有自己的运行线程的类。我有以下代码来测试开始一个新线程。

class SingletonClass
{
public:
    SingletonClass();
    virtual ~SingletonClass(){};

    static SingletonClass& Instance();
    void DoSomething();
private:
    static void MyThread(std::string data);

    std::thread m_thread;
};

SingletonClass::SingletonClass()
{
    m_thread = std::thread(MyThread, "test");
}

void SingletonClass::MyThread(std::string data)
{
    while(1)
    {
        std::cout<<data<<std::endl;
    }
}

void SingletonClass::DoSomething()
{
    std::cout<<"Hello"<<std::endl;
}

SingletonClass& SingletonClass::Instance()
{
    static SingletonClass _instance;
    return _instance;
}


int _tmain(int argc, _TCHAR* argv[])
{
    SingletonClass& singleton = SingletonClass::Instance();
    singleton.DoSomething();    

    return 0;
}

当我运行我的程序时,调用了线程函数,然后程序只是因为这个错误而爆炸:

enter image description here

为什么会这样?如果实例化类,我怎样才能使线程继续运行

修改

我在线程对象中添加了一个私有变量,并在构造函数中将其踢掉。它现在没有崩溃。

1 个答案:

答案 0 :(得分:2)

这是std::thread的析构函数所做的(§30.3.1.3[thread.thread.destr]):

~thread();
     

如果joinable(),请致电std::terminate()。否则,没有   效果。 [注意:隐式分离或加入joinable()   析构函数中的线程可能导致难以调试   正确性(用于分离)或性能(用于连接)遇到的错误   只有在引发异常时才会因此程序员必须确保这一点   当线程仍然可以连接时,析构函数永远不会被执行。    - 结束记录]

当构造函数退出时,thread构造函数中创建的本地SingletonClass将被销毁,从而导致调用terminate()(默认情况下会调用abort())。< / p>

可能的解决方法是让thread成为Singleton类的成员,join成为Singleton的析构函数(显然,如果你这样做,你会需要一些方法来通知线程退出)。或者,您可以考虑在detach()的构造函数中Singleton线程。