我试图在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*) ¶m[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);
}
答案 0 :(得分:2)
我编写标准C代码大约已有10年了,所以原谅任何小错误。我认为我可以在概念上帮助你。
您正在静态分配缓冲区。相反,确定所涉及的大小并动态分配所需的内存。这是一个good reference。在读取文件时基本确定 n ,并使用malloc根据该值分配 list 和 param ,而不是分配固定数组。
您对分拣部件有什么具体问题?您是否收到编译器错误,运行时错误,错误的排序结果,......?
更新:
这里的a discussion of serial and parallel sorting包括在C中实现并行奇数偶数转换排序。