Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 跨线程拆分文本文件_C_File_Pthreads_Distributed - Fatal编程技术网

C 跨线程拆分文本文件

C 跨线程拆分文本文件,c,file,pthreads,distributed,C,File,Pthreads,Distributed,问题是:我有一些文本文件(10),每行都有数字。我需要将它们拆分到使用pthread库创建的一些线程中。创建的这些线程(工作线程)将查找发送给它们的最大素数(以及所有文本文件中的最大素数) 我目前对解决方案的想法是:我想我自己有两个数组,一个数组中的所有文本文件,另一个数组将包含一个二进制文件,我可以读取1000行,然后将指针发送到包含id、文件指针和文件位置的结构中该二进制文件的索引,并让它运行 我要说的是: pthread_create(&threads[index],NULL,wo

问题是:我有一些文本文件(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;
如果任何人有任何见解或更好的解决方案,将不胜感激

编辑: 好吧,我找到了解决问题的办法,我相信这和萨维瑟尔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个文件。

看起来像是消息队列的作业:

  • 将数据分割成块的一组“供应商”线程 然后放入队列。在您的情况下,区块可以用文件名或 (fd,offset,size)元组。为了简单起见,可以有这样一个元组 供应商
  • 从输入中提取数据的“辅助”线程数 队列,对其进行处理并将结果放入另一个队列。为了提高性能 原因通常有很多员工,例如,如果您的任务是 CPU密集型
    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;
        }
      }