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感谢您的评论。是否可以为每个新线程向加密函数发送不同的计数值?