我希望创建一个具有自己的运行线程的类。我有以下代码来测试开始一个新线程。
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;
}
当我运行我的程序时,调用了线程函数,然后程序只是因为这个错误而爆炸:
为什么会这样?如果实例化类,我怎样才能使线程继续运行
修改
我在线程对象中添加了一个私有变量,并在构造函数中将其踢掉。它现在没有崩溃。
答案 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
线程。