我試圖做一個線程局部排序, 我的電流輸出,它部分線程排序用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;
}
你知道我要去哪裏嗎? 我認爲它的結構,但我在網上看到的一切都做我正在做的事情。
堆棧溢出沒有調試或代碼審查的服務。見[問] – Olaf
歡迎來到sw開發的樂趣階段。你嘗試使用調試器嗎? – pm100
你正在向線程傳遞'a'的指針。然後,'a'立即被破壞,因爲它是一個局部變量,超出了範圍。然後一段時間後,這個線程真的開始了,並且看着'a'曾經的空間。 – immibis