2016-02-25 54 views
0

我試圖做一個線程局部排序, 我的電流輸出,它部分線程排序用C

27 12 21 48 15 28 82 69 35 91 
13 82 33 35 46 5 35 28 87 95 
0 10 20 22 23 30 52 80 86 96 
3 8 42 53 67 70 70 71 75 79 
5 8 8 18 41 43 70 79 86 88 
10 51 56 60 65 84 87 91 94 99 
23 25 38 39 40 44 51 56 69 75 
20 21 25 29 29 38 66 71 73 96 
33 50 9 6 13 27 97 21 70 22 
3 4 6 6 7 15 34 59 63 70 

正如你看到的,我得到它部分分類我希望我的輸出是這個(無合併在端部)

12 15 21 27 28 35 48 69 82 91 
5 13 28 33 35 35 46 82 87 95 
0 10 20 22 23 30 52 80 86 96 
3 8 42 53 67 70 70 71 75 79 
5 8 8 18 41 43 70 79 86 88 
10 51 56 60 65 84 87 91 94 99 
23 25 38 39 40 44 51 56 69 75 
20 21 25 29 29 38 66 71 73 96 
6 9 13 21 22 27 33 50 70 97 
3 4 6 6 7 15 34 59 63 70 

我能得到正確的輸出,如果不是使用一個結構我使用&陣列[i]和手動輸入長度

這是我到目前爲止的代碼:

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <pthread.h> 

int cmpfunc(const void *a, const void *b) { 
    return (*(int*)a - *(int*)b); 
} 

struct values { 
    int *arrayptr; 
    int length; 
}; 

void *thread_fn(void *a) { 
    struct values *start = a; 

    qsort(start->arrayptr, start->length, sizeof(int), cmpfunc); 
    return (void*)a; 
} 

int main(int argc, const char *argv[]) {  
    FILE *fp = fopen(argv[3], "r"); 
    FILE *fp1 = fopen("numS1.dat", "w+"); 

    //amount of threads 
    int threadAmount = atoi(argv[1]); 
    //size of input 
    int numberAmount = atoi(argv[2]); 

    //multidimensional array 
    int array[threadAmount][numberAmount/threadAmount]; 

    for (int i = 0; i < threadAmount; i++) 
     for (int j = 0; j < numberAmount/threadAmount; j++) 
      fscanf(fp, "%d", &array[i][j]); 

    pthread_t threadid[threadAmount]; 

    for (int i = 0; i < threadAmount; ++i) { 
     struct values a = { array[i], numberAmount/threadAmount }; 

     pthread_create(&threadid[i], NULL, thread_fn, &a); 
    } 

    for (int i = 0; i < threadAmount; ++i) 
     pthread_join(threadid[i], NULL); 

    for (int i = 0; i < threadAmount; i++) { 
     if (i != 0) 
      fprintf(fp1, "\n"); 
     for (int j = 0; j < numberAmount/threadAmount; j++) 
      fprintf(fp1 ,"%d ", array[i][j]); 
    } 

    return 0; 
} 

你知道我要去哪裏嗎? 我認爲它的結構,但我在網上看到的一切都做我正在做的事情。

+3

堆棧溢出沒有調試或代碼審查的服務。見[問] – Olaf

+0

歡迎來到sw開發的樂趣階段。你嘗試使用調試器嗎? – pm100

+0

你正在向線程傳遞'a'的指針。然後,'a'立即被破壞,因爲它是一個局部變量,超出了範圍。然後一段時間後,這個線程真的開始了,並且看着'a'曾經的空間。 – immibis

回答

2

您正在將指向自動存儲的指針傳遞給新創建的線程:struct values對象一旦退出調用範圍就會失效,因此新線程無法可靠地訪問該對象。你應該分配struct values並通過指向分配對象作爲參數來pthread_create

for (int i = 0; i < threadAmount; ++i) { 
    struct values *a = malloc(sizeof(*a)); 

    a->arrayptr = array[i]; 
    a->length = numberAmount/threadAmount; 

    pthread_create(&threadid[i], NULL, thread_fn, a); 
} 

結構可通過該線程功能退出之前被釋放。

注:

  • 拆分陣列成塊僅在長度爲線程數的倍數的工作方式。
  • 比較功能不適用於大int值工作,你應該使用這樣的:

    int cmpfunc(const void *a, const void *b) { 
        return (*(int*)b < *(int*)a) - (*(int*)a < *(int*)b); 
    } 
    
+0

好的,謝謝!! malloc是什麼錯了。我也會改變比較功能。 – SirJames