Threading Void 中的分離執行緒
在多執行緒程式設計中,分離執行緒即使在與原始所有者執行緒分離後仍會繼續執行。這就提出了一個問題:當主執行緒退出時,仍在運行的分離執行緒會發生什麼事?
標準回應
C 標準(N3797)保持沉默關於 main() 退出時分離線程的命運。第 1.10 節(程序終止)和第 30.3 節(執行緒)都沒有明確定義該行為。
儘管有此遺漏,但通常假設分離的執行緒繼續運行,直到完成執行。這個假設源自於這樣一個事實:執行緒是由作業系統控制的實體,可能不會被程式的主執行緒終止。
潛在危險
但是,允許分離如果這些線程訪問屬於其他線程的變量或靜態對象,或者在靜態對象銷毀後接觸靜態對象,則線程無限期地繼續可能會導致未定義的行為
特別是,C 標準(第 1節)規定,在所有執行緒物件都被銷毀並且任何潛在的訊號處理程序完成執行之後,唯一允許的程式碼是訊號處理程序中允許的程式碼(例如,函式庫)。這排除了大多數 C 庫功能,包括條件變數。
異常方法
為了防止在main() 退出時分離執行緒仍在運行時出現未定義的行為,開發人員可以採用兩種方法之一:
結論
儘管 C 標準沒有明確定義 detached 的行為當 main() 退出時,執行緒會繼續執行直到完成。開發人員應意識到所涉及的潛在危險,並採取適當的措施(手動加入或訊號處理程序安全)以避免未定義的行為。
以上是當 C 中主執行緒退出時,分離執行緒會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!