多執行緒全域性物件析構導致執行緒執行出錯

2021-06-17 00:10:39 字數 912 閱讀 3519

這樣的問題應該大多出現在大的程式裡面,出現這樣問題一般具備幾個條件:

1、全域性物件太多;

2、多執行緒;

3、執行緒很多,主程序沒有等待執行緒結束

4、主程序由於某種原因終止

原因分析:

首先全域性物件太多,主程序結束時需要一定的時間析構各全域性物件;此時,先析構的全域性物件由於主程序忙著析構其他的全域性物件,所以執行緒依然是可以訪問這部分記憶體的,可是,由於已經析構了,所以可能導致執行緒程式出問題或奔潰。

下面以乙個例子來說明:

#include #include #include #include using namespace std;

struct constructsleep

};struct test

};//constructsleep g_c; //後析構

test g_class;

constructsleep g_c; //先析構

void* pthread(void*)

return null;

}int main()

g_c定義在g_class前後,對輸出結果有差別。

為避免出現上述錯誤,有以下幾點需要遵循:

1、盡可能少使用全域性物件

2、在使用全域性物件時,要有一定的檢測錯誤機制(極端情況下,這也不能避免錯誤)

3、最好主程序要等待執行緒結束(但是執行緒是while迴圈就不可能了)

4、龐大的全域性物件要後定義,這樣就可以先析構。

執行緒自我終止會導致執行緒內部物件的析構異常?

一開始主線程a是作為乙個對話方塊ctestdlg存在,現在,在ctestdlg的成員函式onstartthread中開始乙個新執行緒b,onstartthread函式中cstring區域性變數stra 注1 作為執行緒b工作函式的引數pparam,ctestdlg的成員函式onendthread用於...

C 全域性物件構造和析構

注 此為小白引導教程 引入 c 中的全域性物件什麼時候執行建構函式?什麼時候執行析構函式?與區域性物件又有什麼區別?正文 思路是這樣的,我們先寫乙個類,乙個有點簡單 又不簡單 的類 include include using std string using std cout using std e...

多執行緒執行(限制執行緒數)

多執行緒執行 限制執行緒數 coding utf 8 import threading from ctypes import import queue,os import time,datetime class store threading.thread def init self,store,q...