簡體   English   中英

在循環中創建線程向量的問題

[英]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和線程管理的內容?

隨時詢問更多詳細信息或代碼。

解決方案:

  • 預留空間
  • 通過值傳遞i的參考

該代碼不執行您期望的操作。

vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)};

這將正確調整向量的大小以容納numThreads元素。 但是,這種初始化后跟emplace_backpush_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.

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