不要輕易使用TerminateThread中止執行緒

2021-06-01 09:41:56 字數 530 閱讀 6601

聽過無數次不要terminatethread,只是工作中常用,貌似也沒有什麼問題。今天在高強度測試中發現了乙個不可原諒的錯誤。參看下面的例子

dword __stdcall mythread(void* )

}int _tmain(int argc, _tchar* argv)

為什麼死鎖呢?new操作符用的是小塊堆,整個程序在分配和**記憶體時,都要用同一把鎖。如果乙個執行緒在占用該鎖時被殺死(即臨死前該執行緒在new或delete操作中),其他執行緒就無法再使用new或delete了,表現為hang住。

《核心程式設計》裡明確提醒不要terminatethread,但原因並不是血淋淋滴。今天發現的這個bug印證了此書的價值。

另註:許多臨時的網路操作經常用terminatethread,作為網路不通時的退出機制,以後要改改了。比如讓該執行緒自生自滅,自行退出。

exitthread是推薦使用的結束乙個執行緒的方法,當呼叫該函式時,當前執行緒的棧被釋放,然後執行緒終止,相對於terminatethread函式來說,這樣做能夠更好地完成附加在該執行緒上的dll的清除工作

切忌,不要輕易使用指向棧的指標

程式 include void f1 int j void any function use local variables int main int i 10 int j i f1 j cout j j 中斷入口 由於傳入的是j的引用,函式返回後j仍指向棧中l的空間。而函式返回時並沒有修改棧中各個...

不要輕易相信ALV

近日發現一詭異顯現,2lis 02 scl採購資料上傳時,資料量字段 例如cpquabu 資料上到dso時,數量被放大了十倍 如psa數量為6,到了dso後變為60 經除錯,例程中未做任何處理。但是執行報表的時候資料顯示又是正確的。原來是alv在作怪。用alv顯示dso資料時,系統自動調整小數字數為...

不要輕易相信AnnotationHub的物種注釋包

bioconductor開發的物種注釋包系列集合了乙個物種不同 的注釋資訊,能夠根據基因id對其進行多種 的注釋,比如說基因的別名,基因的功能等。at1g13970 na na at1g14120 na na at1g14240 na na at1g14600 na na 一開始得到的結果裡沒有多少...