2013-10-12 2 views
0

Я пытаюсь сортировать некоторые числа, хранящиеся в массиве в каждом заданном сегменте.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; 
} 

Может ли кто-нибудь дать мне немного идеи? Благодаря! Извините, если мой английский трудно понять ...

+1

Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Каждый поток нуждается в собственной копии структуры данных, идентифицируя поддиапазон массива, который он должен сортировать. Окончательное слияние, по-видимому, объединит все отдельно отсортированные сегменты в один объединенный. –

+0

Рассмотрите мьютекс/блокировку. – ChuckCottrill

ответ

0

Так же, как у вас есть массив, чтобы каждый pthread имел свой собственный tid, есть другой массив, чтобы каждый pthread мог иметь свой собственный индекс: вы могли бы передавать разные структуры каждому pthread, который хранит этот индекс pthread, а также указатель на структуру, которую они все разделяют.