2015-03-13 74 views
1

我想存儲的std::threads最好的C++存儲指針

載體目前的載體11的方式,我實現了它作爲std::vector<std::thread*> 然而,這需要手動刪除std::thread小號

會是什麼成爲最優雅的C++ 11方法嗎?我可以看到std::shared_ptr,但這不是一種矯枉過正的行爲嗎?指針是唯一的,但是std::vector需要臨時複製它們。

也許我不需要指針,但std::thread是不可複製的,我想我可以。

謝謝!

+4

不,「std :: vector」支持移動類型。如果你確實需要一個指針向量,你可以看看'boost :: ptr_vector'。 – chris 2015-03-13 16:59:53

+2

「但是,這需要手動刪除std :: threads」爲什麼大家都假設每個指針都必須被刪除? – juanchopanza 2015-03-13 17:04:50

+0

@juanchopanza因爲每個分配了新需求的對象都被刪除 - 無論是明確的還是通過RAII(智能指針)。 – 2015-03-13 17:10:21

回答

11

由於C++ 11,vector只要求其值可移動,因爲thread就是。所以vector<thread>應該符合你的需求。

對於使用不可複製類型可以執行的操作有幾個限制 - 您不能複製或移出值,只能移動或放置它們 - 但這些操作很容易適應。

如果您確實需要存儲不可移動的類型(例如mutex),那麼unique_ptr可能是最好的選擇;或者像dequelist這樣的容器,它不需要移動它的值。

4

同比可以使用std::vector<std::thread>emplace_back

threads.emplace_back([](int i){ ++i; }, 10); 

emplace_back使用完美轉發直接傳遞它的參數std::thread構造,並在vector內部存儲器放置新的對象,像:

new (vector_ptr + offset) std::thread(args...); 

它只涉及移動 - 處理對象的新語義,這是替代c選擇,並且在資源使用方面可能更便宜。 std::thread支持移動

+3

@rici:線程是可移動的,這足以調整矢量大小。 – 2015-03-13 17:09:44

+1

@MikeSeymour:是的,我的觀點是它涉及到移動。 – rici 2015-03-13 17:10:23

+0

@rici,如果你知道最大線程數,你可以簡單地調用'reserve()' – myaut 2015-03-13 17:15:30

1

如果您的編譯器支持C++ 11,則使用std :: unique_ptr,如果您的編譯器不支持,則使用boost :: shared_ptr。

不,這不是過度的 - 這是很好的編程。

+3

爲什麼不'std :: thread'本身?它就像'unique_ptr'一樣可移動。增加不必要的間接性是過度的,並且不是很好的編程。 (如果編譯器不支持C++ 11,它不支持線程) – 2015-03-13 17:14:35

+0

好點。我專注於指針的問題,而不是線程(請參閱問題的標題)如果對象是可移動的(哪些線程),您的答案會更好。 – 2015-03-13 17:16:50

+0

爲什麼以及如何在非C++ 11編譯器中使用'std :: shared_ptr'? – 2015-03-13 18:06:44