向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
相关产品推荐
相关产品推荐

