簡體   English   中英

具有遞歸函數的C ++線程

[英]C++ thread with a recursive function

void merge_sort_thread(vector<int>& array) {
if (1 < array.size()) {
    vector<int> array1(array.begin(), array.begin() + array.size() / 2);
    thread first= thread(merge_sort_thread,array1);

    vector<int> array2(array.begin() + array.size() / 2, array.end());
    thread second = thread(merge_sort_thread,array2);
    first.join(); //wait for both ended
    second.join();
    merge (array1.begin(),array1.end(),array2.begin(),array2.end(),array.begin());
}

我正在使用Xcode構建和運行,這是構建失敗。 有提示:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:332:5:嘗試使用已刪除的功能

我知道這里的線程效率不高,但是我想知道為什么這行不通。

std::thread推導綁定參數的類型,並將其副本存儲在線程對象中。 在您的情況下,該參數被推論為參考。 但是,正如您所知,引用不能被復制。 如果要傳遞對std::thread內部函數的引用,則可以使用std::ref創建可復制的引用包裝器:

thread first(merge_sort_thread,std::ref(array1));

你做的copy initialization (見這里 ),和線程不准是顯而易見的原因可復制的對象。

相反,請替換此類代碼

 thread foo = thread(...);

有了這個

thread foo(...);

或者,如果您沒有恐懼症(例如我...)來編寫丑陋的代碼,並且您相信第11個C ++的承諾...

thread foo{...};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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