簡體   English   中英

提高線程對象的生命周期和線程生存期

[英]Boost thread object lifetime and thread lifetime

我想從線程入口函數退出一起刪除boost線程對象。 如果我啟動線程函數並將共享指針傳遞給擁有線程對象實例的對象,然后,當線程函數退出時,它會同時與線程對象一起銷毀此對象,這是不是錯了嗎?

編輯:也許我會描述為什么我想這樣做。 我必須使用低級別的dbus API。 我想要做的是創建適配器類,它將啟動自己的線程並等待傳入​​消息,直到DISCONNECT消息到達。 如果它到達我想關閉線程並殺死適配器本身。 適配器是一個活動對象,它運行發送到其調度程序的方法。 在從dbus讀取消息后,這些方法再次將自己置於調度程序隊列中。 但是如果它是DISCONNECT消息,它們不應該發送方法而只是退出調度程序線程,銷毀Adapter對象。 嗯,看起來太復雜了......

Boost.Thread文檔中,您可以看到不應刪除可連接的線程對象,否則將調用std::terminate

因此,您應該確保如果線程是可連接的,則應在擁有該線程的對象的析構函數中調用join()detach() 注意:如果線程本身正在銷毀對象,則join()不是一個選項。 線程將嘗試連接自身,從而導致死鎖。

但是,如果您記住這些限制,則可以從其自己的執行線程中銷毀線程。

你可以這樣做,但你可能不應該這樣做。

boost::thread對象的主要目的是可以監視關聯的線程。 在大多數情況下,擁有線程監視器本身並沒有多大意義。

正如其他答案所暗示的那樣,你可以detach線程並拋出boost::thread對象。 這樣做通常被認為是不好的風格,除非監控職責首先轉移到另一個對象。 例如,許多簡單的工作線程在完成時設置了未來。 未來已經提供了我們需要的所有監控,因此我們可以分離線程。

你永遠不應該完全分離一個線程,這樣你就失去了監視它的所有方法。 你必須至少能夠保證一個干凈的關閉,如果你完全拆除它們,除了最瑣碎的線程之外的所有線程都不可能。

我不確定是否可以解決您的使用案例,但聽起來像您不必這樣做。

boost :: thread對象的生命周期不一定與線程本身一致。 意思是如果你不在乎你也可以啟動線程,在它上面調用detach()並使對象超出范圍。 然后它被刪除但線程仍然會運行,直到它的功能完成。 唯一的問題是,你將無法加入它。 因此,如果您的程序在線程仍然運行時完成,它將崩潰。

如果您關心這些東西,問題可能是錯誤的,因為在這種情況下,您將存儲對象並在刪除之前調用join()。

暫無
暫無

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

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