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 ...
随机推荐
- Unity主线程和子线程跳转调用(2)
在上一篇介绍了多线程和Unity交互方式,但是由于我的项目是一个unity编辑器插件项目,很显然上一篇的代码需要加以修改,在编辑器下实现Loom. 1,Editor下的没有Update这个生命周期函数 ...
- ZUI分页器的使用案例(ECLIPSE SMS项目)
不足:并未编写导出功能 HTML代码: <form action="${basePath}/SMSLogList.cwai" method="post" ...
- Angular2学习笔记一
TypeScript: TypeScript变量声明:let和const是JavaScript里相对较新的变量声明方式,const是对let的一个增强,它能阻止对一个变量再次赋值. var作用域或函数 ...
- mybatis之Sql语句构建器
SQL类: 方法 描述 SELECT(String) SELECT(String...) 开始或插入到 SELECT子句. 可以被多次调用,参数也会添加到 SELECT子句. 参数通常使用逗号分隔的列 ...
- spring boot 入门一 构建spring boot 工程
最近在学习Spring boot,所以想通过博客的形式和大家分享学习的过程,同时也为了更好的学习技术,下面直接进入Spring boot的世界. 简介 spring boot 它的设计目的就是为例简化 ...
- 容易忽略的小知识之 Date 函数参数
Date 对象启用基本存储器并取得日期和时间. dateObj = new Date()dateObj = new Date(dateVal)dateObj = new Date(year, mont ...
- HDU4418 Time travel(期望dp 高斯消元)
题意 题目链接 Sol mdzz这题真的太恶心了.. 首先不难看出这就是个高斯消元解方程的板子题 \(f[x] = \sum_{i = 1}^n f[to(x + i)] * p[i] + ave\) ...
- 如何解决css-子div设置margin-top后,父div与子div一起下移的bug?
根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边距重叠. 这是规范引起的普遍问题. 只要给父盒子设 ...
- 爬虫必备—scrapy-redis(分布式爬虫)
转载自:http://www.cnblogs.com/wupeiqi/articles/6912807.html scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单 ...
- 阿里云短信服务Java版
短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm java短信发送API https://help.aliyun.com/document_ ...