读取多个线程共享文件的访问权限:pthreads

时间:2014-08-20 17:29:28

标签: c multithreading file pthreads

我必须实现一个应用程序,其中用户通过命令行传递多个单词,并且应用程序在每行文件中查找单词的计数。每个单词都会在自己的主题中搜索文件。

到目前为止,我已将其实现为单线程应用程序。

代码如下:

 //Below function reads file line and returns it
char* readLine(FILE* file, char* line)
{
 if (file == NULL) {
        printf("Error: file pointer is null.");
        exit(1);
    }

 int maximumLineLength = 128;
 char *lineBuffer = (char *) malloc(sizeof(char) * maximumLineLength);
    if (lineBuffer == NULL) {
        printf("Error allocating memory for line buffer.");
        exit(1);
    }


 char ch = getc(file);//Get each character
 int count = 0;
    //loop for line or EOF
    while ((ch != '\n') && (ch != EOF))
    {
        if (count == maximumLineLength)
        {
            maximumLineLength += 128;
            lineBuffer = realloc(lineBuffer, maximumLineLength);
           if (lineBuffer == NULL)
           {
                printf("Error reallocating space for line buffer.");
                exit(1);
            }
        }

   lineBuffer[count] = ch;
   count++;
   ch = getc(file);
    }

  lineBuffer[count] = '\0';//Add null character

  line = (char *) malloc(sizeof(char) * (count + 1));
  strncpy(line, lineBuffer, (count + 1));
  free(lineBuffer);
  return line;
}



//Below function finds the occurance of
//word in the line
//Need to refine to take into consideration
//scenarios such that {"Am"," am "," am","?Am",".Am"}etc 
int findWord(char* line,char* word)
{
 int count=0;

 int lineLen = strlen(line);
 int wordLen = strlen(word);

 char* temp= (char *) malloc(sizeof(char) * (lineLen+1));
 strcpy(temp,line);

    while(true)
    {
     if( strstr(temp,word) == NULL)
     break;
     strcpy(temp, strstr(temp,word));
    // printf("@@%s\n",temp);
     strcpy(temp,temp+wordLen+1);
    // printf("##%s\n",temp);
     count++;
     }
//printf("%d\n",count);
free(temp);
return count;
}

//Below function fills the linked list for data structure lineCount
//with word occurance statistics
//line by line and the total
//The number of elements in the list would be number of lines in the 
//file
LineCount* findCount(FILE* file, char* word,LineCount** lineCountHead)//Make it multithreaded fn()
{
  LineCount* lineHead= NULL;

  char* line = NULL;
  int lineNumber=1;
  int count=0;


  if (file == NULL) {
        printf("Error: file pointer is null.");
        exit(1);
    }

  while (!feof(file)) {
        LineCount* temp=NULL;
        line = readLine(file, line);
        //printf("%s\n", line);
     count=findWord(line,word);

     //Critical Section Start
     temp=LineCountNode(lineNumber,count);
     addToLineCountList(temp,lineCountHead);
     //Criticla Section End


     lineNumber++;
              }


  free(line);
  return lineHead;
}

所以基本上我希望我的调用线程函数为LineCount* findCount(FILE* file, char* word,LineCount** lineCountHead)

我的理解是,文件将被访问 - 仅供线程读取,因此无需处理同步。

目前我正在打开文件: pFile = fopen (argv[1],"r");。我的问题是如何在读共享模式下打开? 我知道在C++中存在一个读共享模式。如何在c

中实现这一目标

另外,我如何以线程调用函数所需的格式编写函数LineCount* findCount(FILE* file, char* word,LineCount** lineCountHead),即格式为void* fn(void*)

1 个答案:

答案 0 :(得分:1)

在只读模式下,文件本身没有问题,标准C库中的IO功能不能从多个线程并行中使用。它们是线程安全的(或至少,我认为是这样)但是从多个线程正确使用它们并非易事。

在最低级别,每个FILE结构包含一个文件位置指针 - 或者IO函数维护一个OS提供的指针。让多个线程弄乱文件光标位置听起来像是一种让你的生活更加困难的好方法。

最好的方法是多次打开文件 - 每个帖子一次。然后每个线程都有自己的FILE指针,流缓冲区等。请注意,这并非C& POSIX线程 - 这是使用多线程的固有问题。

无论如何,我不确定你是通过使用多个线程来实现的。通常这样的搜索操作是I / O绑定 - 对同一文件的多线程访问很可能会使事情变得更糟。

唯一可能有意义的情况是,如果你有大量的字符串来搜索你有一个 I / O线程为所有其他线程提供服务通过共同的缓冲区。这将分配CPU密集型部分,而不会导致过度的I / O ......