c++线程用递归函数

C++ thread with a recursive function

本文关键字:递归函数 线程 c++      更新时间:2023-10-16
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构建和运行,这是一个构建失败。提示符:

/应用程序/xcode/内容/开发/工具链/XcodeDefault.xctoolchain/usr/include/c++/v1/线程: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{...};