看个例子

 class CTimer{
public:
// 析构函数
virtual ~CTimer(){ }
// 开始
void start()
{
b_exit = false;
i = ;
t = new std::thread(&CTimer::run, this);
} void run()
{
// Sleep(1000);
// i = 800;
stop();
return;
} // 结束
void stop()
{
int lll = i;
b_exit = true;
if (t->joinable())
{
t->join();
}
}
private:
std::thread *t;
std::thread *t1;
int i;
bool b_exit;
};
void main(){
CTimer time_test;
time_test.start();
//time_test.stop();
system("pause");
}

如图所示,程序会崩溃,分析了是因为两个线程都在编辑变量t,子线程调用t时主线程不一定赋值已经完成,就会造成空指针的操作,加锁可避免这种问题

附一个别人遇到的问题

 ConsoleUploadFile::ConsoleUploadFile()
{
   ... ...
   
    std::thread( &ConsoleUploadFile::uploadFile, this);
} 很奇怪的是,代码运行到std::thread(...)这句就崩溃了,还没有跑子线程绑定的函数uploadFile,我开始怀疑不能在构造函数中开线程,就另写了一个成员函数,但也是运行到std::thread(..)就崩溃。google了一番,没有进展,只能靠调试了,崩溃的现场是这样的: libc++..dylib`std::__1::thread::~thread(): 0x7fff8c2c9984:  pushq  %rbp 0x7fff8c2c9985:  movq   %rsp, %rbp 0x7fff8c2c9988:  cmpq   $, (%rdi) 0x7fff8c2c998c:  jne   0x7fff8c2c9990           ; std::__1::thread::~thread() + 0x7fff8c2c998e:  popq   %rbp 0x7fff8c2c998f:  ret     0x7fff8c2c9990:  callq  0x7fff8c2ca4fc            ; symbol stub for: std::terminate() 0x7fff8c2c9995:  nop     仔细看一下,这里怎么会调用thread的析构函数呢?问题就出在这里,直接放一个光溜溜的构造函数,当然会被马上析构了... 改成:        _thread = std::thread( &ConsoleUploadFile::uploadFile, this); 就可以了,_thread为成员变量。 可是,程序退出的时候,又崩溃了,是在析构函数崩溃的 ConsoleUploadFile::~ConsoleUploadFile()
{
} libc++..dylib`std::__1::thread::~thread(): 0x7fff8c2c9984:  pushq  %rbp 0x7fff8c2c9985:  movq   %rsp, %rbp 0x7fff8c2c9988:  cmpq   $, (%rdi) 0x7fff8c2c998c:  jne   0x7fff8c2c9990            ; std::__1::thread::~thread() + 0x7fff8c2c998e:  popq   %rbp 0x7fff8c2c998f:  ret     0x7fff8c2c9990:  callq 0x7fff8c2ca4fc            ; symbol stub for: std::terminate() 0x7fff8c2c9995:  nop     还是和子线程有关,看来是有什么资源没有释放,又是一顿查,原来需要call 一下join(),文档上是这么说的: After a call to this function, the thread object becomes non-joinable and can be destroyed safely. ConsoleUploadFile::~ConsoleUploadFile()
{
    _thread.join();
}

c++ thread 使用不当导致的崩溃问题的更多相关文章

  1. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文地址: http://www.tuicool.com/articles/F7reem http://blog.csdn.net/yl2isoft/article/details/11711833 ...

  2. Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...

  3. fastjson反序列化使用不当导致内存泄露

    分析一个线上内存告警的问题时,发现了造成内存告警的原因是使用fastjson不当导致的. 分析dump发现com.alibaba.fastjson.util.IdentityHashMap$Entry ...

  4. WPF 线程中异常导致程序崩溃

    一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnh ...

  5. Windows分页文件设置不当导致SQL Server服务被终止

    Windows分页文件设置不当导致SQL Server服务被终止 文章说明 在正式开始验证和测试之前,先介绍Windows分页文件和SQL Server的动态内存管理.下面测试将分为两种测试场景:场景 ...

  6. 线程崩溃为什么不会导致 JVM 崩溃

    大家好,我是坤哥 网上看到一个很有意思的据说是美团的面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但都没答到根本原因,所以决定答一答,相信大家看完肯定会有收获,本文分以下几 ...

  7. SELinux配置不当导致vsftpd系统用户不能登陆

    1.测试是否是SELinux配置不当导致的: setenforce 0 再次登陆ftp,正常,说明是SELinux配置不当导致.还原配置 setenforce 1 2.查看配置: getsebool ...

  8. Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃

    api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者. 问题描述: 当主线程在某个槽函数里正在执行processEvents时, 刚 ...

  9. 疑似CPU或者内存故障导致进程崩溃

    我们有一个服务跑在微软云的所有宿主机上.最近发现某一台机器上该服务进程持续崩溃.崩溃原因是访问了一个无效指针,对应的代码如下 serviceListIniBuffer.AppendF("Se ...

随机推荐

  1. Json.Net 反序列化成匿名对象

    反序列化一个object var str1 = "{id:1,name:'111',x:[1,2,3],y:{a:'ssss',b:'dddd'}"; var obj1 = Jso ...

  2. webfrom后台

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  3. .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7

    目录: .net core 2.2 部署CentOS7(1)安装虚拟机 .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7 .net core 2.2 部署CentOS7( ...

  4. Java设计模式(三)单例模式

    一.场景描述 在采集到仪器数据后,需要将数据发送到lims系统中,通过调用lims系统服务实现数据的上传. 在仪器数据采集组件中实现lims系统服务代理,该代理需要指定服务地址url,认证信息(用户名 ...

  5. Zookeeper学习文章目录1

    目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...

  6. 客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法

    客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信 ...

  7. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  8. js实现放大镜的效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. CSS 画一个八卦

    效果图: 实现原理: 设置高度为宽度的2倍的一个框,利用 border 补全另一半的宽度,设置圆角 用两个 div 设置不同的颜色,定位到圆的上下指定位置. 最后只剩下里面的小圆圈了.设个宽高,圆角即 ...

  10. CSS选择器之基本选择器+属性选择器

    1.1      id选择器 #main{ font-size:12px; margin:0; padding:0; } 其中的#main就是id选择器,用于选择HTML页面中id = "m ...