You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向pthread_create传递文件指针数组参数失败,求解决方法

向pthread_create传递文件指针数组的问题

我尝试向pthread_create函数传递文件指针数组作为参数时遇到了困难。

以下是创建文件指针数组并以只读模式打开文件的代码:

FILE *arqvs[arq];
for(int i=1, count=0;i<=arq;i++, count++){
  changeName(file, i); //根据索引修改文件名
  arqvs[count] = fopen(file, "r");
  
  if(arqvs[count]==NULL){
    printf("Erroro:(\n");
    exit(1);
  }
}

这段代码测试下来能正常工作,可根据变量arq的数值读取所有文件。但传递给pthread_create时出了问题。

创建线程的代码:

for(int i=0;i<trd; i++){
  pthread_create(&thread[i], NULL, funcao, &**arqvs);
}

线程函数代码:

void * funcao(void * args){
  char voto[2];
  FILE *** fileName = (FILE***) args;
  while (fgets(voto, sizeof(voto), *fileName[0])) {
  printf("%s", voto); 
  pthread_exit(NULL);
}

这段代码无法正常运行,我很久没写C语言了,希望得到提示或解答。


问题分析与修复方案

1. 参数传递的核心错误

你在pthread_create里传递的&**arqvs是完全错误的:

  • arqvs是FILE*类型的数组,数组名本身可以隐式转换为指向数组首元素的指针(即FILE**类型)。
  • &**arqvs等价于&(*(*arqvs)),最终得到的是单个FILE*类型的指针,和线程函数里强转的FILE***类型不匹配,这种类型混乱直接导致运行错误。

2. 线程函数的类型强转错误

线程函数里把参数强转为FILE***完全多余,正确传递的话,参数应该是FILE**(指向文件指针数组的指针)或者单个FILE*(如果每个线程处理一个文件)。

3. 多线程访问的潜在问题

如果多个线程共享同一个文件指针,会导致文件读写位置混乱。你应该给每个线程分配独立的文件指针,或者确保每个线程处理不同的文件。

修正后的代码示例

场景1:每个线程处理数组中的一个独立文件

// 线程创建代码
for(int i=0;i<trd; i++){
  // 传递数组中第i个文件指针的地址
  pthread_create(&thread[i], NULL, funcao, &arqvs[i]);
}

// 线程函数
void * funcao(void * args){
  char voto[2];
  // 直接强转为单个FILE*
  FILE *file = (FILE*) args;
  // fgets读取时,voto大小为2,最多读取1个字符加终止符
  while (fgets(voto, sizeof(voto), file)) {
    printf("%s", voto); 
  }
  pthread_exit(NULL);
}

场景2:传递整个文件指针数组给线程(需注意同步)

// 线程创建代码
for(int i=0;i<trd; i++){
  // 直接传递数组名(隐式转换为FILE**)
  pthread_create(&thread[i], NULL, funcao, arqvs);
}

// 线程函数
void * funcao(void * args){
  char voto[2];
  // 强转为FILE**类型,即文件指针数组的指针
  FILE **fileArray = (FILE**) args;
  // 示例:处理数组中的第一个文件,实际可根据线程逻辑选择目标文件
  while (fgets(voto, sizeof(voto), fileArray[0])) {
    printf("%s", voto); 
  }
  pthread_exit(NULL);
}

额外注意事项

  • 确保arqvs数组的生命周期覆盖所有线程的运行周期:如果arqvs是主线程的局部变量,主线程要调用pthread_join等待所有线程结束后再退出,避免栈内存被销毁导致线程访问无效指针。
  • 文件操作完成后,记得调用fclose关闭所有打开的文件指针,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Game changer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:40:22