c++ - C++中多线程快速排序期间的段错误

标签 c++ multithreading quicksort

#include <iostream>
#include <algorithm>
#include <future>
#include <iterator>

using namespace std;

void qsort(int *beg, int *end)
{

    if (end - beg <= 1)
        return;

    int lhs = *beg;
    int *mid = partition(beg + 1, end, 
        [&](int arg)
        {
            return arg < lhs;
        }
    );

    swap(*beg, *(mid - 1));

    qsort(beg, mid);
    qsort(mid, end);
}

std::future<void> qsortMulti(int *beg, int *end) // SEG FAULT
{

    if (end - beg <= 1)
        return future<void>();
    int lhs = *beg;
    int *mid = partition(beg + 1, end, 
        [&](int arg)
        {
            return arg < lhs;
        }
    );

    swap(*beg, *(mid - 1));
    //spawn new thread for one side of the recursion
    auto future = async(launch::async, qsortMulti, beg, mid);
    //other side of the recursion is done in the current thread
    qsortMulti(mid, end);
    future.wait();
    inplace_merge(beg, mid, end);
}

void printArray(int *arr, size_t sz)
{
    for (size_t i = 0; i != sz; i++)
        cout << arr[i] << ' ';
    cout << endl;
}

int main()
{
    int ia[] = {5,3,6,8,4,6,2,5,2,9,7,8,4,2,6,8};
    int ia2[] = {5,3,6,8,4,6,2,5,2,9,7,8,4,2,6,8};
    size_t iaSize = 16;
    size_t ia2Size = 16;
    qsort(ia, ia + iaSize);
    printArray(ia, iaSize);
    qsortMulti(ia2, ia2 + ia2Size);
    printArray(ia2, ia2Size);
}

从上面的代码可以清楚地看出,我只是在尝试实现相同的 qsort 函数,但具有多个线程。关于相关问题的堆栈溢出的其他问题和答案让我想到了这个版本的代码,这给我留下了一个非常简单的问题和相关问题: 是什么导致多线程部分导致段错误? 需要明确的是:我不需要任何人为我构建解决方案,我更愿意得到关于在哪里可以找到段错误源的指示或指示,因为我没有看到它。提前致谢!

最佳答案

为了制作std::async返回 std::future<T> 类型的对象,你传递给它的函数只需要返回 T .示例:

int compute() { return 42; }
std::future<int> result = std::async(&compute);

在您的情况下,这意味着 qsortMulti应该有签名

void qsortMulti(int* beg, int* end);

并且无需从中返回任何内容。在您提供的代码中,qsortMulti返回 std::future<void>本身,这导致 std::async返回 std::future<std::future<void>> 类型的对象,这可能不是您想要的。此外,您的函数仅在范围为空的情况下返回某些内容(在顶部的 if 中)。在所有其他代码路径中(例如,到达函数末尾)您根本没有返回任何内容,这导致调用者访问未初始化的对象,这可能是段错误的原因。

关于c++ - C++中多线程快速排序期间的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609593/

相关文章:

c++ - 转换为 JPEG 时损坏的 HEIC 图 block

c++ - 原子变量c++

multithreading - 控制台应用程序 - DbContext 实例不能在 OnConfiguring 内部使用

ios - 动画还在,当主线程做其他事情时

c++ - 从派生类的 friend 那里使用基类的 protected 静态函数

c++ - 已发布的 qt .exe 无法在另一台计算机上打开

multithreading - 如何设置 Scala actor 独占使用单独的线程运行?

c++ - 使用 double 值实现快速排序

c - 双向链表快速排序 C

c++ - C++ 库中不使用堆排序