gpt4 book ai didi

c - 跨线程拆分文本文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:53 25 4
gpt4 key购买 nike

问题:我有几个文本文件 (10),每一行都有数字。我需要将它们拆分到我使用 pthread 库创建的一些线程中。这些创建的线程(工作线程)将找到发送给它们的最大素数(以及所有文本文件中的所有最大素数)。

我目前对解决方案的想法:我想自己有两个数组,一个数组中的所有文本文件,另一个数组将包含一个二进制文件,我可以读取 1000 行并将指针发送到索引该二进制文件包含 id、文件指针和文件位置,并让它通过它。

我正在谈论的一点点:

pthread_create(&threads[index],NULL,workerThread,(void *)threadFields[index]);//Pass struct to each worker

结构:

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 作为标记值来指示“(尚未)找到素数”。

Let's say I wanted 11 threads instead of 10; how would I split the workload then?

我会让第 11 个线程立即执行 pthread_exit()。如果你想为自己制造协调问题,你可以,但为什么要让生活变得比你必须的更难。

如果您绝对必须让 11 个线程处理 10 个文件并分担工作,那么我想我可能会在队列中最初设置 10 个文件流。线程将等待条件“队列不为空”以获取文件流(互斥锁和条件等等)。当线程获取文件流时,它会从文件中读取一个数字并将流推回队列(信号队列不为空),然后处理该数字。在 EOF 上,线程将关闭文件而不是将其推回队列(因此​​线程必须检测“没有文件流留下未读数据”)。这意味着每个线程将读取大约十分之一的数据,具体取决于素数计算实际读取的数字所花费的时间。与每个文件一个线程的简单解决方案相比,这在编码方面要棘手得多,但它可以(或多或少)扩展到任意数量的线程和文件。特别是,它可以用于让 7 个线程处理 10 个文件,以及让 17 个线程处理 10 个文件。

关于c - 跨线程拆分文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com