2017-01-12 17 views
0
#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関数を実装しようとしていますが、複数のスレッドを使用しています。関連する問題に関するスタックオーバーフローに関する他の質問と回答は、このバージョンのコードにつながりました。私には非常に単純な問題と関連する質問が残されています。 マルチスレッドセクションでセグメンテーションフォルトが発生する原因は何ですか? 明確にするには:誰も私のためにソリューションを構築する必要はありません。私はそれが表示されないので、セグメンテーション違反の原因を見つけるための指示や指示があります。前もって感謝します!マルチスレッドクイックソートでのC++でのセグメンテーションエラー

+1

デグサガーは何を言ったのですか? –

答えて

2

std::asyncstd::future<T>型のオブジェクトを返すようにするには、それに渡す関数はTを返すだけです。例:qsortMultiが署名

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

と何がそれから返されなければなら持っていることになっていることを意味し、あなたの場合は

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

。提供したコードでqsortMultistd::future<void>を返します。std::asyncstd::future<std::future<void>>というオブジェクトを返します。これはおそらく意図したものではありません。さらに、範囲が空の場合(上部のif)、関数は何かを返すだけです。他のすべてのコードパス(関数の終わりに達するなど)では、呼び出し元が初期化されていないオブジェクトにアクセスすることにつながる何も返さず、segフォルトの理由が考えられます。

関連する問題