[英]Problems creating vector of threads in a loop
我試圖在循環內創建不同的線程,並將其存儲在線程向量中。
編輯1 :線程數由用戶指定。
const int numThreads = stoi(argv[3]);
初始代碼 :
vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)};
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.emplace_back(
move(thread{FFT, ref(vectorBuffersUC), ref(vectorBuffersCD), ref(i), ref(numThreads)}));
}
編輯2:我在最后加入線程。
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT[i].join();
}
調試代碼時,出現分段錯誤(信號= SIGABRT)。 我試過刪除move子句並通過push_back()
更改emplace_back()
push_back()
,但是我仍然得到相同的結果。
編輯3:當我為此另一個功能僅創建一個線程時,它有時仍會崩潰(但並非每次都崩潰):
thread th2{separator, ref(vectorBuffersUC), ref(numThreads), ref(nitems)};
標題如下:
void separator(vector<unique_ptr<lockedBufferUC>> &vectorBuffersUC, int numThreads, const long nitems){}
我開始懷疑這是由於我為向量提供的參數以及函數如何接收它們。
我是否缺少有關C ++ 11和線程管理的內容?
隨時詢問更多詳細信息或代碼。
解決方案:
該代碼不執行您期望的操作。
vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)};
這將正確調整向量的大小以容納numThreads
元素。 但是,這種初始化后跟emplace_back
或push_back
會在numThreads
索引處添加一個元素,而不是您期望的0
。
這里要做的一些正確的事情之一是先reserve
向量,然后再執行emplace_back
。
另外,不需要move
。 通過優化,編譯器足夠聰明,可以就地構建。
另一件事是,除非要detaching
線程,否則必須join
線程。 joinable
,如果沒有加入銷毀線程調用std::terminate
。
const int numThreads = stoi(argv[3]);
vector<thread> vectorThreadsFFT;
vectorThreadsFFT.reserve(numThreads);
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.emplace_back(
std::thread {FFT, ref(vectorBuffersUC), ref(vectorBuffersCD), i, ref(numThreads)} );
}
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.join();
}
您將對i
引用傳遞給線程的閉包,因此在循環結束后,它立即失效。 嘗試僅按值傳遞id
:
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.emplace_back(
thread{FFT, ref(vectorBuffersUC), ref(vectorBuffersCD), i, ref(numThreads)});
}
此外,您不應該將std::move
用於諸如thread{}
類的右值對象。
並且,正如@Arunmu所提到的,您一定不要忘記在vector銷毀之前join
所有線程(這將導致terminate
,請參閱docs )。
更好的解決方案是使用std::async
不手動處理連接。 此外,它將允許您使用延遲執行和更好的並行可伸縮方法(請參閱docs )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.