2017-06-29 97 views
1

C++ 11 &以上什麼優點或缺點存儲一std::thread直接像這樣類的成員時存儲在C++ 11智能指針一個std ::螺紋

std::thread my_thread; 

與之相對到存儲std::shared_ptrstd::unique_ptr到線程像這樣:

std::shared_ptr<std::thread> my_thread_ptr; 

是任意的代碼選項優於其他?或者,這並不重要,只需2種不同的方式來處理線程對象。

+3

你知道嗎,不是優點還是缺點?看看線程的特殊成員函數做了什麼,然後決定這是否是你想要的外部類的行爲。 –

+0

爲什麼你將它存儲在'std :: shared_ptr'或'std :: unique_ptr'中?我沒有看到這一點,'std :: thread'只是包裝實現定義的線程句柄。 – Akira

+0

這似乎是一個列表問題。而是問一些關於特定案例的具體問題並解釋你的約束。 –

回答

5

可能存在的指針(或智能指針)成員的用法一些不常見的原因,但常見的用法似乎std::thread要麼不適用或具有足夠的靈活性本身:

  • 我們可能希望控制在成員的整個生命週期中,例如「懶惰地」初始化它。 std::thread已經支持它。它可以在「不表示線程」狀態下創建,稍後在需要時分配真實線程,並且可以提前編輯。
  • 我們可能希望將會員轉入其他所有權。因爲std::thread已經支持移動和交換,所以不需要指針。
  • 我們可能希望對象是動態多態的,但std::thread沒有任何虛擬成員函數。
  • 我們可能希望指針隱藏實現細節並減少依賴關係,但std::thread是標準庫類,所以我們不能使它變得不透明。

所以我們應該直接使用它作爲數據成員。

+1

共享所有權是我現在可以提出的唯一用例 –

1

如果您有將std :: thread作爲成員變量的選項,那就去做吧。如果不是,請考慮其他選項。除非您有充分理由這樣做,否則請勿將其包裹在std::shared_ptrstd::unique_ptr之內。鑑於std::thread本身是可移動的,所以很不可能將它包裝到智能指針中。