c++ thread 使用不当导致的崩溃问题
看个例子
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 使用不当导致的崩溃问题的更多相关文章
- WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
原文地址: http://www.tuicool.com/articles/F7reem http://blog.csdn.net/yl2isoft/article/details/11711833 ...
- Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...
- fastjson反序列化使用不当导致内存泄露
分析一个线上内存告警的问题时,发现了造成内存告警的原因是使用fastjson不当导致的. 分析dump发现com.alibaba.fastjson.util.IdentityHashMap$Entry ...
- WPF 线程中异常导致程序崩溃
一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnh ...
- Windows分页文件设置不当导致SQL Server服务被终止
Windows分页文件设置不当导致SQL Server服务被终止 文章说明 在正式开始验证和测试之前,先介绍Windows分页文件和SQL Server的动态内存管理.下面测试将分为两种测试场景:场景 ...
- 线程崩溃为什么不会导致 JVM 崩溃
大家好,我是坤哥 网上看到一个很有意思的据说是美团的面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但都没答到根本原因,所以决定答一答,相信大家看完肯定会有收获,本文分以下几 ...
- SELinux配置不当导致vsftpd系统用户不能登陆
1.测试是否是SELinux配置不当导致的: setenforce 0 再次登陆ftp,正常,说明是SELinux配置不当导致.还原配置 setenforce 1 2.查看配置: getsebool ...
- Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃
api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者. 问题描述: 当主线程在某个槽函数里正在执行processEvents时, 刚 ...
- 疑似CPU或者内存故障导致进程崩溃
我们有一个服务跑在微软云的所有宿主机上.最近发现某一台机器上该服务进程持续崩溃.崩溃原因是访问了一个无效指针,对应的代码如下 serviceListIniBuffer.AppendF("Se ...
随机推荐
- linq之多表连接
1.左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals ...
- 设计模式学习--面向对象的5条设计原则之依赖倒置原则--DIP
一.DIP简介(DIP--Dependency Inversion Principle): 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象.2.抽象不应该依赖于细节,细节应该依赖于抽象. ...
- java反射实现接口重试
工具类: import java.lang.reflect.Method; public class RetryUtil { private static ThreadLocal<Integer ...
- SPA应用部署时首屏启动慢问题解决方案
SPA应用部署时首屏启动慢问题解决方案 使用vuejs开发的单页应用,打包部署上线后,发现首屏启动时间达到了惊人的10s左右,于是开始优化,目前使用到的总结如下: 巧用webpack插件 1.抽取cs ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
- xcode 调试器 LLDB
本文完全转载,转载地址:点击这里 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函 ...
- 第三节:我的第一个Java程序
一.编写我的第一个Java程序流程: 1.新建一个文本文档:在电脑任意位置“右击”----->选择“新建”----->选择“文本文档”: 2.修改文档名与后缀名:“右击”新建的文本文档-- ...
- 使用iview-admin2构建的项目,热更新无法启动
原因:@vue/cli-service版本是3.0.1解决:升级@vue/cli-service到最新版本
- 利用:before和:after伪类制作类似微信对话框
今天学到了怎么做一个小三角形,进而结合其他属性把类似微信对话框的图形做出来了. 先做出如下形状: .arrow { width: 30px; height:30px; border-width:20p ...
- CSS 小结笔记之浮动
在css中float是一个非常好用的属性,float最基本用法是用来做文字环绕型的样式的. 基本用法:float:left | right 例如 <!DOCTYPE html> <h ...