c - 使用线程的多文件访问

标签 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);
}

最佳答案

是的,你应该加入你的线程,因为没有创建分离线程(而且你可能没有足够深入地学习 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/

相关文章:

java - 访问 EclipsePreferences 的线程安全方式(项目)

c - 加入线程困惑

c - 在c中使用usleep作为Timer是否合适

选择 pthread 中的打印顺序

c - 监听两个不同端口的 TCP 服务器

c - 更新 select() 调用中的超时值

ios - 如何在使用 DispatchQueue 时停止从主线程快速执行正在运行的后台线程

android - 如何中断AsyncTaskLoader的后台线程?

linux - 可执行文件上的 setuid 似乎不起作用

c - ATMega128 启动时输出闪烁