MULTITHREADING c - 读取同一文件中的多个文件

时间:2012-11-17 00:24:06

标签: c multithreading pthreads mutex

我是多线程的新手,我正在尝试使用多线程模拟同一个当前账户上的银行交易。 每个线程都从文件中读取要执行的操作。该文件将包含由整数组成的每一行的操作。主程序必须创建与路径中的文件一样多的线程。

int main(int argc,char*argv[]){

  DIR *buff;
struct dirent *dptr = NULL;
pthread_t hiloaux[MAX_THREADS];     
int  i=0,j=0, nthreads=0;
char *pathaux;


memset(hiloaux,0,sizeof(pthread_t)*MAX_THREADS);
diraux=malloc((267+strlen(argv[1]))*sizeof(char));
buff=opendir(argv[1]);
while((dptr = readdir(buff)) != NULL && nthreads<MAX_THREADS)//read files in the path
    {


    if (dptr->d_name[0]!='.'){    
        pthread_mutex_lock(&mutex_path);//mutual exclusion  
        strcpy(pathaux,argv[1]);        
        strcat (pathaux,"/");
        strcat (pathaux,dptr->d_name);//makes the route (ex:path/a.txt)

        pthread_create(&hiloaux[nthreads],NULL,readfile,(void *)pathaux);
        //creates a thread for each file in the path
                   nthreads++;
    }

}

for (j=0;j<nthreads;j++){
pthread_join(hiloaux[j],NULL);
}

  closedir(buff);
  return 0;

}

我的问题是线程似乎没有收到正确的路径参数。尽管我已经放置了一个互斥锁(mutex_path),但它们都读取了相同的文件。我在函数readfile(),。

中解锁了这个互斥锁
void *readfile(void *arg){
FILE *fichero;
int x=0,n=0;
int suma=0; 
int cuenta2=0;


char * file_path = (char*)arg;
n=rand() % 5+1; //random number to sleep the program each time I read a file line
pthread_mutex_unlock(&mutex_path);//unlock the mutex

fichero = fopen(file_path, "r");

    while (fscanf (fichero, "%d", &x)!=EOF){

           pthread_mutex_lock(&mutex2);//mutual exclusion to protect variables(x,cuenta,cuenta2)        

         cuenta2+=x;    

          if (cuenta2<0){
        printf("count discarded\n");
          }

          else cuenta=cuenta2;      
          pthread_mutex_unlock(&mutex2);

    printf("sum= %d\n",cuenta);
    sleep(n); //Each time i read a line,i sleep the thread and let other thread read other fileline
}
 pthread_exit(NULL);
fclose(fichero);

} 当我运行程序时,我得到了这个输出

alberto@ubuntu:~/Escritorio/practica3$ ./ejercicio3 path
read file-> path/fb
read -> 2
sum= 2
read file-> path/fb
read -> 2
sum= 2
read file-> path/fb
read -> 4
sum= 6
read file-> path/fb
read -> 4
sum= 6
read file-> path/fb
read -> 6
sum= 12
read file-> path/fb
read -> 6
sum= 12

它似乎运行良好,它读取一行并且睡了一段时间,在此期间另一个线程完成它的工作,但问题是两个线程都打开相同的文件(path / fb)。 正如我之前所说,我认为问题出在路径论证中,就像mutex_path没有使他的工作。 我真的很感激对此的一点帮助,因为我真的不知道什么是错的。

非常感谢。

2 个答案:

答案 0 :(得分:0)

在“readfile”函数中

char * file_path =(char *)arg;

只需将指针复制到字符串内存中,而不是内存本身。 因此,当工作线程继续时,它可以(并且将会)由man线程更改。

在那里制作一份记忆副本。

或者甚至更好地将所有参数存储在主线程的不同内存中,所以你根本不需要第一个互斥锁。

答案 1 :(得分:0)

首先,我没有看到你为pathaux分配内存的地方。我想知道strcpy或strcat如何工作而不是内存分段。尝试使用C ++编译器进行编译,它可能会抱怨。

关于你传递指针的问题,所以每个线程都指向同一个位置。 正确的方法将在readdir循环内 - 1.创建内存并复制它的路径。(注意你想每次循环创建内存) 2.将此内存传递给新线程。 如果你这样做: 一个。您不必使用互斥路径。 湾在readfile方法结束时调用free。