多线程全局对象析构导致线程运行出错
来源:互联网 发布:vscode css格式化插件 编辑:程序博客网 时间:2024/05/18 03:43
这样的问题应该大多出现在大的程序里面,出现这样问题一般具备几个条件:
1、全局对象太多;
2、多线程;
3、线程很多,主进程没有等待线程结束
4、主进程由于某种原因终止
原因分析:
首先全局对象太多,主进程结束时需要一定的时间析构各全局对象;此时,先析构的全局对象由于主进程忙着析构其他的全局对象,所以线程依然是可以访问这部分内存的,可是,由于已经析构了,所以可能导致线程程序出问题或奔溃。
下面以一个例子来说明:
#include <iostream>#include <stdlib.h>#include <pthread.h>#include <unistd.h>using namespace std;struct ConstructSleep{ ~ConstructSleep() { sleep(1); }};struct TEST{ int x; ~TEST() { x = 0; } };//ConstructSleep g_c; //后析构TEST g_class;ConstructSleep g_c; //先析构void* pthread(void*){ while (true) { usleep(100000); cout << "g_class.x = " << g_class.x << endl; } return NULL;}int main(){ g_class.x = 100; pthread_t pid; pthread_create(&pid, NULL, pthread, NULL); return 0;}
g_c定义在g_class前后,对输出结果有差别。
为避免出现上述错误,有以下几点需要遵循:
1、尽可能少使用全局对象
2、在使用全局对象时,要有一定的检测错误机制(极端情况下,这也不能避免错误)
3、最好主进程要等待线程结束(但是线程是while循环就不可能了)
4、庞大的全局对象要后定义,这样就可以先析构。
- 多线程全局对象析构导致线程运行出错
- java多线程-线程运行状态-获取线程对象以及名称
- C Runtime 链接库不匹配导致全局静态对象没有析构
- 线程自我终止会导致线程内部对象的析构异常?
- 全局对象何时析构
- 全局对象和全局静态、局部静态析构顺序
- OpenMP 单线程改多线程结果出错
- Windows多线程总结(4)-- 线程同步(使用互斥对象实现线程同步 只运行一个对象)
- C++ 全局对象构造和析构
- 区域性问题导致多语言软件运行出错
- JRE运行环境出错导致无法安装STM32CubeMX解决方法
- android对象没有初始化导致运行崩溃
- JSP不同线程导致对象改变
- GetDC()导致gdi对象不断增长致软件出错
- 特殊字符导致json字符串转换成json对象出错
- 由于js对象浅拷贝导致的遍历出错
- Win32多线程之线程对象与线程
- 当析构函数遇到多线程──C++ 中线程安全的对象回调
- mysql数据库之视图
- 【职场星座】12星座职场心理资本
- “SCRIPT5007: 无法获取属性“nodeName”的值” 或 “TypeError: a is undefined”
- mysql集群之mysql-mmm在centos下的全程安装和配置(四)
- hive 配置参数说明
- 多线程全局对象析构导致线程运行出错
- linux中断嵌套以及中断丢失
- hdu 4604 2013多校
- 位运算与嵌入式编程之位制转换之一
- ::前面没有类名 代表了全局作用域
- Android的webview加载本地html、本apk内html和远程URL
- 东软---实习报告
- c# 调用 pdf2swf.exe
- jar(包)