我正在使用多个线程来访问使用线程的各种随机文件。但是,我收到错误消息 [Thread 0x7ffff7007700 (LWP 16256) exited]
。此外,信息线程显示仅创建了 2 个线程。但是,我正在尝试创建其中的 100 个。另外,我是否必须在我的案例中使用 pthread_join() 函数?代码:
#define NTHREADS 100
void *encrypt(void *args)
{
int count = *((int*) args);
AES_KEY enc_key;
AES_set_encrypt_key(key, 128, &enc_key);
int i;
for(i=1;i<=count;i++){
char *ifile;
char *ofile;
long length;
size_t result;
char * buffer;
sprintf(ifile,"random_files/random_%d.txt",i);
FILE *ifp = fopen(ifile,"rb");
if (ifp==NULL) {fputs ("File error",stderr); exit (1);}
fseek(ifp,0, SEEK_END);
length = ftell(ifp);
fseek (ifp,0, SEEK_SET);
buffer = (char*) malloc (sizeof(char)*length);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
result = fread (buffer, 1, length, ifp);
if (result != length) {fputs ("Reading error",stderr); exit (3);}
printf("%s",buffer);
fclose (ifp);
free(buffer);
}
}
int main(){
int i,j,count =0;
pthread_t threads[NTHREADS];
for (i=0; i<NTHREADS; i++){
count = count +20;
int *count_ptr = &count;
if(pthread_create(&threads[i], NULL, encrypt, count_ptr)!=0){
fprintf(stderr, "error: Cannot create thread # %d\n", i);
break;
}
}
printf("After Thread\n");
exit(0);
}
最佳答案
是的,你应该加入你的线程,因为没有创建分离线程(而且你可能没有足够深入地学习 pthreads 来处理它)。
也就是说,您的线程参数存在严重的逻辑问题。它们全部获取main
中相同 count
变量的地址。在不修改线程过程的情况下更改它的最快方法可能是简单地建立一个与线程匹配的 int counts[NTHREADS]
的并排数组,使用每个元素作为相应线程的数据参数:
int main()
{
pthread_t threads[NTHREADS];
int counts[NTHREADS]; // HERE
int i,j,count =0;
for (i=0; i<NTHREADS; i++)
{
counts[i] = (count += 20);
if(pthread_create(&threads[i], NULL, encrypt, counts+i)!=0) // LAST PARAM
{
fprintf(stderr, "error: Cannot create thread # %d\n", i);
break;
}
}
for (i=0; i<NTHREADS; ++i)
pthread_join(threads[i], NULL));
return EXIT_SUCCESS;
}
或者,您可以做一些动态分配循环,或者通过 intptr_t
发送值,转换为 void*
,但是上面显示的方法的优点是不需要改变你的线程过程,这是我的目标。
我已将您的线程过程中的任何问题留给您解决,但这至少应该让您在线程堆栈上启动并运行。
关于c - 使用线程的多文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618610/