Я пытаюсь сортировать некоторые числа, хранящиеся в массиве в каждом заданном сегменте.merge sort with pthread using struct
typedef struct _sortee{
int * nums;//array of numbers to be sorted
size_t num_elems;//# of elements in each segment
size_t segment_count;//# of segments
int **ptrs;//pointers to the array of numbers
int index;
}sortee;
Проблема заключается в том, что каждый раз, когда создается поток, число в sortlist-> индекс меняется, поэтому иногда не правильный сегмент сортируется. Я знаю, чтобы исправить это, я должен передать массив структуры, которую я создал как 4-й параметр в pthread_create, но я не могу придумать идею, так как у структуры также будет отсортирован массив.
pthread_t tid[sortlist->segment_count];
for(i=0; i<(int)sortlist->segment_count; i++){
sortlist->index = i;
pthread_create(&tid[i], NULL, sort, sortlist);
}
for(i=0; i<(int)sortlist->segment_count; i++){
sortlist->index = i;
pthread_join(tid[i], NULL);
}
Это первая часть алгоритма сортировки. После этого у меня есть другая функция слияния, чтобы отсортировать остальные.
void *sort(void *ptr) {
sortee *sortlist = (sortee *)ptr;
qsort(sortlist->ptrs[sortlist->index], sortlist->num_elems, sizeof(int), comp);
fprintf(stderr, "Sorted %d elements.\n", (int)sortlist->num_elems);
return sortlist;
}
Может ли кто-нибудь дать мне немного идеи? Благодаря! Извините, если мой английский трудно понять ...
Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Каждый поток нуждается в собственной копии структуры данных, идентифицируя поддиапазон массива, который он должен сортировать. Окончательное слияние, по-видимому, объединит все отдельно отсортированные сегменты в один объединенный. –
Рассмотрите мьютекс/блокировку. – ChuckCottrill