我想存儲的std::threads
最好的C++存儲指針
載體目前的載體11的方式,我實現了它作爲std::vector<std::thread*>
然而,這需要手動刪除std::thread
小號
會是什麼成爲最優雅的C++ 11方法嗎?我可以看到std::shared_ptr
,但這不是一種矯枉過正的行爲嗎?指針是唯一的,但是std::vector
需要臨時複製它們。
也許我不需要指針,但std::thread
是不可複製的,我想我可以。
謝謝!
我想存儲的std::threads
最好的C++存儲指針
載體目前的載體11的方式,我實現了它作爲std::vector<std::thread*>
然而,這需要手動刪除std::thread
小號
會是什麼成爲最優雅的C++ 11方法嗎?我可以看到std::shared_ptr
,但這不是一種矯枉過正的行爲嗎?指針是唯一的,但是std::vector
需要臨時複製它們。
也許我不需要指針,但std::thread
是不可複製的,我想我可以。
謝謝!
由於C++ 11,vector
只要求其值可移動,因爲thread
就是。所以vector<thread>
應該符合你的需求。
對於使用不可複製類型可以執行的操作有幾個限制 - 您不能複製或移出值,只能移動或放置它們 - 但這些操作很容易適應。
如果您確實需要存儲不可移動的類型(例如mutex
),那麼unique_ptr
可能是最好的選擇;或者像deque
或list
這樣的容器,它不需要移動它的值。
同比可以使用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
支持移動。
如果您的編譯器支持C++ 11,則使用std :: unique_ptr,如果您的編譯器不支持,則使用boost :: shared_ptr。
不,這不是過度的 - 這是很好的編程。
爲什麼不'std :: thread'本身?它就像'unique_ptr'一樣可移動。增加不必要的間接性是過度的,並且不是很好的編程。 (如果編譯器不支持C++ 11,它不支持線程) – 2015-03-13 17:14:35
好點。我專注於指針的問題,而不是線程(請參閱問題的標題)如果對象是可移動的(哪些線程),您的答案會更好。 – 2015-03-13 17:16:50
爲什麼以及如何在非C++ 11編譯器中使用'std :: shared_ptr'? – 2015-03-13 18:06:44
不,「std :: vector」支持移動類型。如果你確實需要一個指針向量,你可以看看'boost :: ptr_vector'。 – chris 2015-03-13 16:59:53
「但是,這需要手動刪除std :: threads」爲什麼大家都假設每個指針都必須被刪除? – juanchopanza 2015-03-13 17:04:50
@juanchopanza因爲每個分配了新需求的對象都被刪除 - 無論是明確的還是通過RAII(智能指針)。 – 2015-03-13 17:10:21