繁体   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