从文件读取多线程

时间:2018-11-18 23:30:06

标签: c multithreading output malloc

我目前正在尝试使用三个单独的程序(process1、2和3)和一个我要从文件中读取并附加到字符串的主程序来产生输出。当前,在我的函数中,我要做的只是1.打开文件,2.读取char,3.将其附加到char缓冲区中,以及4.打印输出。 (这三个进程在产生整数和字符的时间间隔上有所不同。)

//Function for process 1 (Every second)
void thread1_func(void) {
  char *c; //Have to use *c because second param of strcat is a char pointer
  while(1) {
    usleep(50000);
    //Reading from file
    output = fopen("output1.txt", "r");
    fscanf(output, "%c", &c); //Copy int to c
    strcat(o1_buff, &c); //strcat it to char buffer
    printf("Thread 1 file input: %s\n", o1_buff);
    fclose(output);
  }
}

//Function for process 2 (Every 30 seconds)
void thread2_func(void) {
  char *number;
  while(1) {
    usleep(50000);
    //Reading from file
    output = fopen("output2.txt", "r");
    fscanf(output, "%c", &number);
    strcat(o2_buff, &number);
    printf("Thread 2 file input: %s\n", o2_buff);
    fclose(output);
  }
}

//Function for process 3 (Every 120 seconds)
void thread3_func(void) {
  char *character;
  while(1) {
    usleep(50000);
    //Reading from file
    output = fopen("output3.txt", "r");
    fscanf(output, "%c", &character);
    strcpy(o3_buff, &character);
    printf("Thread 3 file input: %s\n", o3_buff);
    fclose(output);
  }
 }

但是,在运行程序时,出现以下错误消息enter image description here

这里到底是什么问题?如果问题是我的缓冲区已满(我是通过“ char o1_buff [1024] = {'\ 0'}”创建的,依此类推),那么我有一个单独的函数,打算立即实现互斥量缓冲区输出被写入输出文件。

1 个答案:

答案 0 :(得分:0)

将评论转换为答案。

您谈论的是流程和线程-不要将两者混为一谈。

如果使用的是POSIX线程,则所有线程函数的签名均不正确;它们应该与void *thread1_func(void *unused) { … }类似,并且应该以{{1​​}}结尾,尽管有点麻烦,因为目前它们中都有无限循环。

您显示的代码不足以证明您的1、30和120秒间隔的主张。

  • 您似乎只有一个全局变量return NULL;,线程一时兴起就粗心地覆盖了它们。那预示着生病了。

  • FILE *output中,您有一个未初始化的指针thread1_func()而不是char *c; —哎呀!其他两个功能也有类似的抱怨。

您尚未显示char c;等全局变量定义。目前尚不清楚主线程是否将访问这些线程。如果是这样,则说明您存在并发控制问题。

请重新阅读有关如何创建MCVE(Minimal, Complete, Verifiable Example)的信息,并记得在问这样的问题时创建MCVE。

由于此代码中没有o1_buff调用,因此无法开始猜测问题出在哪里。收到崩溃消息后,看来您使用的是Mac或BSD计算机。

  

问题是我只为3个文件使用一个输出文件指针。当我将其拆分时,它解决了我的问题。

在线程编程中,请谨慎使用全局变量,尤其是共享变量。尽管POSIX I / O流保护打开的文件句柄免受线程之间的干扰(有关更多信息,请参见flockfile()),但它并不能像在不同线程中进行不同的free()调用一样,防止变量被滥用,以防止它们受到滥用。重置,而不考虑使用哪个线程。

最简单的解决方法是将变量设置为线程函数的局部变量。那就没有干扰了或者,创建三个全局变量。或再次选择,使用互斥或​​类似的访问控制机制来防止线程在使用全局变量时互相干扰。在这种情况下(以及许多其他情况),使变量成为局部变量比替代方案更可取。