C 使用线程的多文件访问
我使用多个线程访问各种随机文件使用线程。但是,我得到一个错误C 使用线程的多文件访问,c,multithreading,pthreads,C,Multithreading,Pthreads,我使用多个线程访问各种随机文件使用线程。但是,我得到一个错误[线程0x7ffff7007700(LWP 16256)退出]。此外,信息线程显示只创建了2个线程。然而,我正在尝试创建100个。另外,在我的例子中是否必须使用pthread_join()函数?守则: #define NTHREADS 100 void *encrypt(void *args) { int count = *((int*) args); AES_KEY enc_key; AES_set_encry
[线程0x7ffff7007700(LWP 16256)退出]
。此外,信息线程显示只创建了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);
}
#定义100
void*加密(void*参数)
{
int count=*((int*)参数);
AES_键和enc_键;
AES加密密钥(密钥、128和enc密钥);
int i;
for(i=1;i代码中缺少一些东西,首先,在加密函数中,您需要在末尾关闭线程,在主函数中也需要关闭线程,但是,在这样做之前,在for循环之后,您需要将它们全部连接起来,然后才能正确地处理和关闭它们
流程将如下所示:
(void) pthread_join(th1, NULL);
(void) pthread_join(th2, NULL);
你可以把它们全部放在一个表格里,以便在tid前加入它们
另一个更新:实际上没有“随机”的东西接下来,我会开始根据tid打开文件,然后添加其他大的实现,您的原样将尝试疯狂地打开文件,无论如何它应该可以工作,但是,我只是说。代码中缺少一些东西,首先,在加密函数中,您需要在最后关闭线程,在主函数中也需要关闭线程,但是,在如果这样做,在for循环之后,您需要将它们全部连接起来,然后它们将被正确地处理和关闭
流程将如下所示:
(void) pthread_join(th1, NULL);
(void) pthread_join(th2, NULL);
你可以把它们全部放在一个表格里,以便在tid前加入它们
另一个更新:没有任何“随机”的情况发生,我会根据tid开始打开文件,然后添加其他大的实现,你的原样会尝试疯狂地打开文件,不管怎样它都会工作,但是,只是说。是的,你应该加入你的线程,因为没有一个线程是独立创建的(而且您可能还没有深入学习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;
}
intmain()
{
pthread_t threads[n线程];
int计数[NTHREADS];//此处
int i,j,计数=0;
对于(i=0;i是的,您应该加入您的线程,因为没有一个线程是独立创建的(而且您可能还没有足够深入地学习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;
}
intmain()
{
pthread_t threads[n线程];
int计数[NTHREADS];//此处
int i,j,计数=0;
对于(i=0;i1.在循环的后续中加入你的线程。2.你有一个竞态条件。主循环中相同的count
,随着每次循环迭代而改变,被所有线程寻址。你向所有线程发送相同的地址。3.验证返回结果。@WhozCraig感谢你的评论。是否可以发送不同的每个新线程的加密函数都有一个计数值?1.在循环的后续过程中加入线程。2.您有一个竞争条件。主线程中相同的count
,随着每次循环迭代而变化,由所有线程寻址。您向所有线程发送相同的地址。3.验证返回结果。@WhozCraig感谢您的评论。是否可以为每个新线程向加密函数发送不同的计数值?