使用 std::thread的时候遇到一个崩溃问题,查了2天,值得一吹。
基础的知识可以看这里C++11线程指南(1)–创建线程,这个哥们写的很好
1,
创建了一个线程,当时会在程序退出的时候崩溃(也就是调用join的时候),百思不得其解,后来才发现我的这个线程创建在了一个单例模式上了。
也就是
class A
{
public:
static A*GetInstance();
A();
~A();
private:
class CGarbo // 它的唯一工作就是在析构函数中删除ZHReadOnlyConfigSettings的实例
{
public:
~CGarbo()
{
if (NULL !=A::m_pInstance)
{
deleteA::m_pInstance;
A::m_pInstance = NULL;
}
}
};
static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
};
也就是说这个单例模式,使用的是 静态区中的数据清理的时候,才会清理线程。结果就是崩溃。
原因的猜测就是这个时候主线程已经结束了,现在进入了操作系统资源回收阶段。
2,
std::thread my_thread(fun);
这个时候fun函数已经开始执行了。
后面加上 join,就是说此时的线程(一般是主线程) 要等该线程执行完了才能往下执行。
后面加上 detach后,就不归你管了,什么时候线程退出要看你函数怎么写的了。
建议用 join
总结,还是在静态区这个地方掉了坑里。熟悉了std::thread的使用方式,说实在的std::thread,简单用用很好, 复杂了话,你会想死,比Qt要难用。