C 跨线程拆分文本文件
问题是:我有一些文本文件(10),每行都有数字。我需要将它们拆分到使用pthread库创建的一些线程中。创建的这些线程(工作线程)将查找发送给它们的最大素数(以及所有文本文件中的最大素数) 我目前对解决方案的想法是:我想我自己有两个数组,一个数组中的所有文本文件,另一个数组将包含一个二进制文件,我可以读取1000行,然后将指针发送到包含id、文件指针和文件位置的结构中该二进制文件的索引,并让它运行 我要说的是:C 跨线程拆分文本文件,c,file,pthreads,distributed,C,File,Pthreads,Distributed,问题是:我有一些文本文件(10),每行都有数字。我需要将它们拆分到使用pthread库创建的一些线程中。创建的这些线程(工作线程)将查找发送给它们的最大素数(以及所有文本文件中的最大素数) 我目前对解决方案的想法是:我想我自己有两个数组,一个数组中的所有文本文件,另一个数组将包含一个二进制文件,我可以读取1000行,然后将指针发送到包含id、文件指针和文件位置的结构中该二进制文件的索引,并让它运行 我要说的是: pthread_create(&threads[index],NULL,wo
pthread_create(&threads[index],NULL,workerThread,(void *)threadFields[index]);//Pass struct to each worker
结构:
typedef struct threadFields{
int *id, *position;
FILE *Fin;
}tField;
如果任何人有任何见解或更好的解决方案,将不胜感激
编辑:
好吧,我找到了解决问题的办法,我相信这和萨维瑟尔BTZ的建议很相似。以下是我实施的内容:
我把这些文件合并到一个二进制文件中,并将其保存在循环中(我必须说明每个条目有多少字节,这是硬编码的)
streamfields*info=threadStruct;
整数指数;
int id=info->id;
无符号int currentNum=0;
int Seek=info->StartPos;
无符号int localLargestPrime=0;
char*buffer=malloc(50);
int-isPrime=0;
while(参见kendpos){
对于(索引=0;索引<1000;索引++){//循环1000次
fseek(文件输出,搜索*sizeof(char)*20,搜索集);
fgets(缓冲区,20,文件输出);
Seek++;
currentNum=atoi(缓冲区);
如果(currentNum>localLargestPrime&¤tNum>0){
isPrime=ChkPrim(currentNum);
如果(isPrime==1)
localLargestPrime=currentNum;
}
}
您可以执行十个线程,每个线程处理一个指定为参数的文件。每个线程将读取自己的文件,检查该值是否大于迄今为止记录的最大素数,如果大于,则检查新数字是否为素数。然后,当完成后,它可以将素数返回给协调线程。协调线程inator线程坐在后面等待线程完成,从每个线程收集最大的素数,并只保留最大的素数。您可能可以使用0作为哨兵值来指示“未找到(尚未找到)”素数
假设我想要11个线程而不是10个;那么我该如何分配工作负载呢
我会让第11个线程立即执行pthread_exit()
。如果你想为自己制造协调问题,你可以,但为什么要让生活比你必须的更艰难呢
如果您必须有11个线程处理10个文件并分配工作,那么我想我可能会在队列中最初设置10个文件流。线程将在“队列不为空”的条件下等待以获得文件流(互斥体和条件等)。当线程获取文件流时,它将从文件中读取一个数字,并将该数字推回到队列中(信号队列不为空),然后处理该数字。在EOF上,线程将关闭该文件,而不会将其推回到队列中(因此线程必须检测“没有留下未读数据的文件流”)。这意味着每个线程将读取大约十一分之一的数据,这取决于它实际读取的数字的基本计算所需的时间。这比简单的每个文件一个线程解决方案要复杂得多,但它可以扩展(或多或少)它可以处理任意数量的线程和文件。特别是,它可以用于让7个线程处理10个文件,也可以让17个线程处理10个文件。您可以处理10个线程,每个线程处理一个指定为参数的文件。每个线程将读取自己的文件,检查该值是否大于它的最大值到目前为止已记录,如果已记录,则检查新数字是否为素数。然后,完成后,它可以将素数返回给协调器线程。协调器线程坐下来等待线程完成,从每个线程收集最大的素数,并仅保留最大的素数。您可能可以使用0作为指示值ate“尚未找到素数” 假设我想要11个线程而不是10个;那么我该如何分配工作负载呢 我会让第11个线程立即执行
pthread_exit()
。如果你想为自己制造协调问题,你可以,但为什么要让生活比你必须的更艰难呢
如果您必须有11个线程处理10个文件并分配工作,那么我想我可能会在队列中最初设置10个文件流。线程将在“队列不为空”的条件下等待以获得文件流(互斥体和条件等)。当线程获取文件流时,它将从文件中读取一个数字,并将该数字推回到队列中(信号队列不为空),然后处理该数字。在EOF上,线程将关闭该文件,而不会将其推回到队列中(因此线程必须检测“没有留下未读数据的文件流”)。这意味着每个线程将读取大约十一分之一的数据,这取决于它实际读取的数字的基本计算所需的时间。这比简单的每个文件一个线程解决方案要复杂得多,但它可以扩展(或多或少)到任意数量的线程和文件。特别是,它可以用于让7个线程处理10个文件,以及让17个线程处理10个文件。看起来像是消息队列的作业:
struct threadFields *info = threadStruct;
int index;
int id = info->id;
unsigned int currentNum = 0;
int Seek = info->StartPos;
unsigned int localLargestPrime = 0;
char *buffer = malloc(50);
int isPrime = 0;
while(Seek<info->EndPos){
for(index = 0; index < 1000; index++){//Loop 1000 times
fseek(fileOut,Seek*sizeof(char)*20, SEEK_SET);
fgets(buffer,20,fileOut);
Seek++;
currentNum = atoi(buffer);
if(currentNum>localLargestPrime && currentNum > 0){
isPrime = ChkPrim(currentNum);
if( isPrime == 1)
localLargestPrime = currentNum;
}
}