如何在奇偶排序程序中创建线程并正确排序?

时间:2010-03-10 23:49:29

标签: c unix

我试图在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 个答案:

答案 0 :(得分:2)

我编写标准C代码大约已有10年了,所以原谅任何小错误。我认为我可以在概念上帮助你。

您正在静态分配缓冲区。相反,确定所涉及的大小并动态分配所需的内存。这是一个good reference。在读取文件时基本确定 n ,并使用malloc根据该值分配 list param ,而不是分配固定数组。

您对分拣部件有什么具体问题?您是否收到编译器错误,运行时错误,错误的排序结果,......?

更新:

这里的a discussion of serial and parallel sorting包括在C中实现并行奇数偶数转换排序。