我使用多个线程使用线程访问各种随机文件。但是,我收到错误[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);
}
答案 0 :(得分:1)
代码中缺少一些东西,首先,在你的加密函数中需要关闭最后的线程以及主函数BUT,在你执行之前,你需要将它们全部加入,然后他们将被正确处理和关闭。
流程将如下:
(void) pthread_join(th1, NULL);
(void) pthread_join(th2, NULL);
您可以将它们全部放入for中以通过tid加入它们。
另一个更新:没有任何东西&#34;随机&#34;继续,我会根据它的tid开始打开文件,然后添加其他大型实现,你将尝试打开疯狂的文件,它应该可以工作但是,只是说。
答案 1 :(得分:1)
是的,你应该加入你的主题,因为没有人创建分离(你可能还不够深入学习pthreads来处理它)。
也就是说,您的线程参数存在严重的逻辑问题。他们所有获取count
中相同 main
变量的地址。可能是最快的方法来改变它而不修改你的线程 - proc只是站在一个并排的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*
,但上面显示的方法的优点是不需要更改thread-proc,我瞄准的目标。
我已经在你的线程proc中留下了任何问题要解决,但这应该让你在你的线程堆栈上运行,至少。