问题:我有几个文本文件(10),每行都有数字。我需要将它们拆分为我使用pthread库创建的一些线程。创建的这些线程(工作线程)将查找发送给它们的最大素数(以及所有文本文件中的所有最大素数)。
我目前对解决方案的想法:我在想自己有两个数组和所有文本文件在一个数组中,另一个数组将包含一个二进制文件,我可以读取1000行并将指针发送到索引包含id,文件指针和文件位置的结构中的二进制文件,让它通过它。
我正在谈论的一点点:
pthread_create(&threads[index],NULL,workerThread,(void *)threadFields[index]);//Pass struct to each worker
STRUCT:
typedef struct threadFields{
int *id, *position;
FILE *Fin;
}tField;
如果有人有任何见解或更好的解决方案,我们将不胜感激
编辑: 好的,所以我找到了解决问题的方法,我相信它与SaveTheRbtz的建议类似。这是我实施的: 我把文件合并到1个二进制文件中并在循环中保持它的大头钉(我必须考虑每个条目的字节数,这是硬编码的)
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;
}
}
答案 0 :(得分:1)
你能做十个线程,每个线程处理一个指定为参数的文件。每个线程将读取自己的文件,检查该值是否大于它到目前为止记录的最大素数,如果是,则检查新数字是否为素数。然后,当它完成时,它可以将prime返回到协调器线程。协调器线程后退并等待线程完成,从每个线程收集最大的素数,并且只保留最大的素数。您可以使用0作为标记值来表示“尚未找到素数”。
假设我想要11个线程而不是10个线程;那我怎么分工呢?
我马上就有第11个帖子pthread_exit()
。如果你想为自己制定协调问题,你可以,但为什么要让生活变得更加艰难。
如果你绝对必须有11个线程处理10个文件并分配工作,那么我想我最初可能会在队列中设置10个文件流。线程将在条件'队列非空'上等待以获得文件流(互斥和条件以及所有这些)。当线程获取文件流时,它将从文件读取一个数字并将流推回队列(信令队列不为空),然后处理该数字。在EOF上,线程将关闭文件而不将其推回队列(因此线程必须检测'没有未读数据的文件流')。这意味着每个线程将读取大约十一个数据,具体取决于主要计算对其实际读取的数字所花费的时间。代码比每个文件解决方案的简单一个线程要复杂得多,但它会(或多或少)扩展到任意数量的线程和文件。特别是,它可以用来让7个线程处理10个文件,并且有17个线程处理10个文件。
答案 1 :(得分:0)
看起来像邮件队列的作业:
sysconf(_SC_NPROCESSORS_ONLN)
应该是好的
选择。max()
函数。这是一种高度可扩展的解决方案,使您能够轻松地将多种不同类型的处理阶段组合成易于理解的管道。