多线程全局对象析构导致线程运行出错

来源:互联网 发布: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、庞大的全局对象要后定义,这样就可以先析构。


原创粉丝点击