Как создавать потоки и правильно сортировать их в нечетно-четной программе сортировки? - PullRequest
0 голосов
/ 11 марта 2010

Я пытаюсь реализовать алгоритм сортировки нечетно-четного транспонирования в c с многопоточностью Программа получит файл с целой строкой, которую нужно правильно отсортировать. Я создал массив, с которым будет работать программа, и правильно читаю данные. Хотя я не совсем уверен, как правильно создавать темы. Я знаю, что количество нитей, которые мне понадобятся, всегда будет N / 2. Однако N не всегда будет 20, так что я сейчас занимаюсь конечной суммой. Это ограничение, хотя b / c N не всегда будет 20. Это может быть выше. Моя программа может обрабатывать только двадцать прямо сейчас. У меня также возникают проблемы с сортировкой, хотя у меня уже есть функция с именем swap. Функция начальной точки, где все это происходит. Я не уверен, с чего начать и в этом вопросе.

Это мой код:

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

int list[20];
int n = 20;
int param[10];

pthread_t threads[10];

void readLINE(char *filename);
void do_swap(int R1, int R2);
void display();
void *startPoint( void *arg );


void readLINE(char *filename)
{
    FILE* file;
    int i,j;
    file = fopen(filename,"r");
    if(file==NULL)
    {
        printf("Error: can't open file.\n");
}
else 
{
    printf("File opened successfully.\n");

    i = 0;
    while(!feof(file))
    {
       fscanf(file,"%d", &list[i]);
       i++;
    }

    printf("The numbers are: \n");
    for(j=0; j< i-1; j++) 
    {
        printf("%d\n", list[j]);
    }

    fclose(file);
 }

 n = i-1;

}

//swap positions of arguments in list array
void swap(int R1, int R2)
{
if (list[R1] >  list[R1+1]) 
{
    int temp = list[R1];
    list[R1] = list[R2];
    list[R2] = temp;
}
}

void display()

{
    int count;
    for (count = 0; count < n; count++)

    {   
        //cout <<  list[count] << " " ;
        printf("%d ",list[count]);
    }
    //cout << endl;
    printf("\n");
}

void *startPoint( void *arg )
{

int R1 = *(int*)arg;

int count;
for (count = 0; count < n/2; count++)
{

}
return 0;
}

int main(int argc, char** argv)
{
pthread_attr_t tattr;

pthread_attr_init (&tattr);
pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM);


readLINE(argv[1]);
printf("list[] presorted:");
display();

//create n/2 threads to do the sorting algorithm
//the parameter to each thread is an int:
//first thread param is 0
//second thread param is 2
//third thread param is 4 etc....
int count;
for (count = 0; count < n/2; count++)
{
    param[count] = count*2;
    pthread_create( &threads[ count], NULL, startPoint, (void*) &param[count]); 
}

//wait for all the reads to finish before exiting the program
//otherwise the process would exit and abort all the threads

for (count = 0; count < n/2; count++)
{
    pthread_join(threads[count], NULL);
}

//display the sorted state of the list
printf("list[] after sorting: ");
display();

exit(0);
}

1 Ответ

2 голосов
/ 11 марта 2010

Прошло около 10 лет с тех пор, как я написал стандартный код на C, так что простите за любые мелкие ошибки. Я думаю, что могу помочь вам концептуально.

Вы распределяете свои буферы статически. Вместо этого определите размеры и динамически выделите необходимую память. Вот хорошая ссылка . Как правило, определяйте n во время чтения в файле и используйте malloc для выделения list и param на основе этого значения вместо выделения фиксированного массива.

Какую конкретную проблему вы испытываете при сортировке? Вы получаете ошибку компилятора, ошибку времени выполнения, неверный результат сортировки, ...?

UPDATE:

Вот обсуждение последовательной и параллельной сортировки , которая включает в себя реализацию параллельной сортировки нечетных четных переходов в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...