使用线程进行多文件访问

时间:2016-09-21 13:54:18

标签: c multithreading pthreads

我使用多个线程使用线程访问各种随机文件。但是,我收到错误[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);
}

2 个答案:

答案 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中留下了任何问题要解决,但这应该让你在你的线程堆栈上运行,至少。