看个例子

 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. python学习之类和实例的属性;装饰器@property

    无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...

  2. asp.net web api 跨域,带cookie

    官网上有一个介绍 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api 但是只支 ...

  3. Maven - dependency那些事儿

    身边有几位刚使用Maven的同学表示——在一个叫"pom.xml"的文件里声明一个依赖就不用去手动添加jar了,感觉这东西和自己手动管理依赖没太大区别. 当然,并不是这样,在此记录 ...

  4. 腾讯云CentOS安装JDK1.8

    购买了腾讯云CentOS7系统,尝试搭建一个博客平台,首先要安装JDK. 一开始尝试用本地FTP上传JDK包到服务器,速度太慢,只有10K左右,放弃. 然后决定在服务器直接下载JDK进行安装. 执行 ...

  5. 规范大于编码-我的javaWeb开发规范

    1.应用名称和数据库名称一致 2.javaBean类名称+s和数据库表名一致 3.返回一条数据时,变量名为javaBean类名称的小写;返回多条数据时,变量名为javaBean类名称的大写 4.jav ...

  6. spring cloud 服务发现

    Eureka 当注册中心使用. 注: 1.当仅有一台Eureka时,不需要向别的节点注册. 2.集群的时候,需要相互注册. 工作方式: 前提: Eureka    //注册中心 provide1  / ...

  7. AutoFac使用方法总结一:注册

    AutoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系.在使用方面主要是register和resolve两类操作. 这篇文章用单元测试的形式列举了AutoFac的常用使用方法 ...

  8. Xshell 6连接本机VirtualBox CentOS 6.5成功方案

    网上的文章铺天盖地,适合自己的没有... 最后老办法:文章+经验+尝试 = 成功,哈哈! 问题和步骤: 1. Xshell 过期了,修改用Free for Home/School版本,https:// ...

  9. sum() 求和用法

    def func(*args): # sum = 0 # for el in args: # sum += el # return sum return sum(args) # sum() 求和 de ...

  10. 阿里云短信服务Java版

    短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm java短信发送API    https://help.aliyun.com/document_ ...