std::thread 的一点感悟

使用 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要难用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值