为什么fscanf在多线程读取期间失败?

为什么fscanf在多线程读取期间失败?,c,multithreading,gdb,valgrind,C,Multithreading,Gdb,Valgrind,我不熟悉pthreads。我正在运行一个线程,该线程对排序文件中的一组随机键进行二进制搜索,并读取该键的值: int binary_search_in_disk(int k_level, int key){ if (!file_exist(level_fname)){ return -1; } char *line = NULL; size_t len = 0; ssize_t read; int num, file_charsize, low_key, m

我不熟悉pthreads。我正在运行一个线程,该线程对排序文件中的一组随机键进行二进制搜索,并读取该键的值:

int binary_search_in_disk(int k_level, int key){

  if (!file_exist(level_fname)){
    return -1;
  }

  char *line = NULL;
  size_t len = 0;
  ssize_t read;

  int num, file_charsize, low_key, mid_key, high_key, value, op;

  // file position measured in long int bytes (4), point to the first char of the 
  // line
  int low, mid, high;

  FILE* level_file = fopen(level_fname, "r");
  printf("fname: %s ,", level_fname);

  // find low key 
  low = 0;
  printf("file exists? %d ,", file_exist(level_fname)); // return 1, file exists

  num = fscanf(level_file, "%d%d%d\n", &low_key, &value, &op); // seg fault, file does not exist
 ... 
}
我有另一个线程从同一个文件中读取键值对,然后销毁该文件并在其位置重命名另一个文件。我在read和destroy函数中添加了
printf
,printf显示两个线程都在读取时发生seg故障。GDB还显示,在seg故障发生时,两个线程都在读取文件。当我运行程序时,seg故障发生在不同的读取值。是什么导致
level_文件
突然变为空

GDB:


发现问题:
打开的文件太多

此:

FILE* level_file = fopen(level_fname, "r");
printf("fname: %s ,", level_fname);
printf("file exists? %d ,", file_exist(level_fname));
不是处理错误的正确方法:文件可能存在,但不可读,或者在调用
fopen
时它可能现在存在但不存在,或者您可能内存不足,或者文件描述符不足,或者

你应该做的是:

FILE *level_file = fopen(level_fname, "r");
if (level_file == NULL) {
  fprintf(stderr, "Unable to open '%s' for reading: %s\n", level_fname, sterror(errno));
  return -1;
}
如果你那样做的话,错误是显而易见的

FILE* level_file = fopen(level_fname, "r");
printf("fname: %s ,", level_fname);
printf("file exists? %d ,", file_exist(level_fname));
FILE *level_file = fopen(level_fname, "r");
if (level_file == NULL) {
  fprintf(stderr, "Unable to open '%s' for reading: %s\n", level_fname, sterror(errno));
  return -1;
}