我很难将一个文件数组作为参数传递给pthread_create函数。
FILE *arqvs[arq];
for(int i=1, count=0;i<=arq;i++, count++){
changeName(file, i); //change the name of the file based on the index
arqvs[count] = fopen(file, "r");
if(arqvs[count]==NULL){
printf("Erroro:(n");
exit(1);
}
}
上面的代码显示了我如何创建数组并在";r〃;模式我做了一些测试,看起来效果不错。Is根据变量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编程了,所以,如果有任何提示或答案,我将不胜感激。
传递给pthread_create
的值(&**argvs
(是FILE *
。但在funcao
中,您将其强制转换为不同的FILE ***
,因此所有内容都会中断(未定义的行为(。
您需要确保传入的值和将void *
强制转换为的值的类型相同。在您的情况下,使用FILE **
可能是最有意义的。因此,您可以将pthread_create调用为:
pthread_create(&thread[i], NULL, funcao, arqvs);
在funcao中,将其用作:
FILE ** files = (FILE**) args;
请注意,当您将数组转换为指针时,arq
(数组的大小(会丢失,因此您无法很好地了解funcao中有多少FILE *
。创建一个同时保存(指向的指针(数组和数组大小的struct
,并将指向该数组的指针传递给线程函数,这可能更有意义。
在C中,数组通常通过将指针传递到数组的第一个元素来传递给函数/线程。如果被调用的函数/线程不知道长度,则通常会传递一个额外的参数,该参数指定数组中的元素数。
如果数组中的元素数量(即arq
的值(对两个线程都是已知的,那么您只需要将指针传递到数组的第一个元素。否则,您还必须将数组中的元素数传递给pthread_create
,例如,将指针传递给同样包含此信息的struct
。
假设数组中的元素数量不必传递,则应该更改行
pthread_create(&thread[i], NULL, funcao, &**arqvs);
至
pthread_create(&thread[i], NULL, funcao, arqvs);
相当于:
pthread_create(&thread[i], NULL, funcao, &arqvs[0]);
这是因为当在该上下文中使用时,数组arqvs
自动衰减为指向数组的第一个元素的指针。
由于数组的元素类型是FILE *
,并且指向数组第一个元素的指针已传递给函数funcao
,这意味着传递的指针的类型是FILE **
。因此,您应该更改行
FILE *** fileName = (FILE***) args;
至:
FILE ** fileName = (FILE**) args;
此外,fileName
似乎不是这个指针的合适名称。一个更好的名称应该是类似files
或streams
的名称。
只需直接传递数组,就不需要使用&
。数组用作函数参数时会自动衰减为指针。
for(int i=0;i<trd; i++){
pthread_create(&thread[i], NULL, funcao, arqvs);
}
void * funcao(void * args){
char voto[2];
FILE **fileName = args;
while (fgets(voto, sizeof(voto), fileName[0])) {
printf("%s", voto);
}
pthread_exit(NULL);
}