0

以下のコードのようなマルチスレッド QuickSort を試します。私は関数 median3 を使用してピボットを見つけ、CUTOFF は InsertionSort によって小さな配列がどのようにソートされるかを定義します。この QuickSort は 1000 要素の配列で問題ありませんが、配列を 10.000 要素に増やすと、pthread_join() で「セグメンテーション違反」が発生します。私はFedora 16でコーディングし、gccに準拠しています

void *q_sort( q_sort_input *input ) {

int *a; int left; int right;
a = input->a;
left = input->left;
right  = input->right;
int i, j;
int pivot;
if (left + CUTOFF < right) {   
    pthread_t thread1, thread2;
           pivot = median3( a, left, right );
    i = left - 1; 
    j = right - 1;         
    #ifdef DEBUG
    int k;
    for (k = 0; k<lenght; k++) printf("%d ",a[k]);
    printf("\n");
    printf("left:%d right:%d pivot:%d \n",left,right,pivot);
    #endif      
    for (;;) {
        while (a[++i] < pivot ); 
        while (a[--j] > pivot ) ; 
        if (i < j) {swap( &a[i], &a[j] );}
        else  break;

    }
    swap( &a[i], &a[right - 1] );        
    #ifdef DEBUG

    for (k = 0; k<lenght; k++) printf("%d ",a[k]);
    printf("\n \n");
    #endif
    q_sort_input*input1= malloc(sizeof(q_sort_input));
    input1->a = a;
    input1->left = left;
    input1->right =  i-1;
    input1->n = input->n;
    pthread_create(&thread1, NULL, q_sort, (void*)input1 );

    q_sort_input*input2= malloc(sizeof(q_sort_input));
    input2->a = a;
    input2->left = i+1;
    input2->right = right;
    input2->n = input->n;
    pthread_create(&thread2, NULL, q_sort, (void*)input2 );
    void *end;
    if (thread1 != NULL) pthread_join(thread1,&end);
    if (thread2 != NULL) pthread_join(thread2,&end);
    free(input1);
    free(input2);
}
else InsertionSort(a, left,right);

}
4

0 に答える 0