簡體   English   中英

C++ 析構函數和 PTHREAD_CANCEL_ASYNCHRONOUS

[英]C++ destructors and PTHREAD_CANCEL_ASYNCHRONOUS

如果異步取消線程,是否保證自動對象的析構函數執行?

你的問題格式不正確。 C++0x 之前的標准 C++ 中沒有“線程”,C++0x 中也沒有異步取消線程。 因此,除了您碰巧使用的特定 C++ 和 pthreads 實現之外,您的問題沒有答案。

也就是說,您實施的答案可能是“否”。 (至少,我不知道答案是肯定的任何實現。)

[編輯]

好的,所以我的知識已經過時了。 在 Linux 上,至少使用現代線程庫,堆棧通常是展開的(根據@Roddy 的回答)。

但是,任何標准都不能保證這種行為仍然是正確的。

從技術上講,我認為這是一個實現質量問題:C++ 標准不涉及 POSIX 線程,而 POSIX 線程標准是一種 C 語言綁定,不涉及 C++。

因此,原則上,C++ 實現可以使這項工作(它甚至可以保證)。 在實踐中,如果它與延遲或異步取消一起工作,我會感到驚訝。

從理論上講,它應該可以正常工作,但值得在您的平台上進行測試。

取消線程最終會調用pthread_exit() ,據我從谷歌搜索可知,它將調用析構函數。 它通過將某種“保證未捕獲”異常一直拋出到線程包裝器來實現這一點,因此所有基於堆棧的對象都以正確的順序被破壞。

例如,請參閱此頁面 這篇博文

在 C++ 中調用 pthread_exit() 時,它必須銷毀所有已在堆棧上創建的對象。 這個過程稱為堆棧展開,這正是您拋出異常時發生的情況。 pthread_exit() 利用 C++ 的這一特性在永久關閉線程之前進行清理。

為此 pthread_exit() 會拋出一些模糊的異常並在放棄線程之前捕獲它。 這樣它就可以很好地清理所有對象。 另一方面,捕捉……變得不可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM