将参数传递给多个线程

时间:2016-08-01 17:37:42

标签: c memory-management pthreads

C的新手,我正在阅读有关如何正确地将参数传递给线程的here。如果这个参数需要传递给多个线程呢?我应该在哪里/如何使用free()?说:

void *foo(void *i) {
    int a = *((int *) i);  
    while(1){
        printf("foo running \n");
        sleep(1);
    }
}

void *bar(void *i) {
    int a = *((int *) i);   
    while(1){
        printf("bar running \n");
        sleep(1);
    }
}

int main() {
    pthread_t threads[2];
    int i;
    for (i = 0; i < 2; i++ ) {
        int *arg = malloc(sizeof(*arg));
        if ( arg == NULL ) {
            fprintf(stderr, "Couldn't allocate memory for thread arg.\n");
            exit(1);
        }
        *arg = i;
        pthread_create(&threads[0], NULL, foo, arg);
        pthread_create(&threads[1], NULL, bar, arg);
    }
    for (i = 0; i < 2; i++){
        pthread_join(threads[i],NULL);
    }
    return 0;
}

在生成线程相同的东西/安全后,在free(arg);中调用main

2 个答案:

答案 0 :(得分:2)

在调用free(arg)之前,您需要确保两个线程都已完成。

这意味着你可以在之后在两个线程上调用pthread_join

for (i = 0; i < 2; i++){
    pthread_join(threads[i],NULL);
}
free(args);

答案 1 :(得分:2)

如果所有线程都需要完全相同的参数,并且它们没有修改参数,则根本不需要动态分配它,而只需将它声明为{{1}中函数作用域的变量功能。如果没有动态分配,则无需释放它。

另一方面,如果你需要在循环中使用单独的参数,则需要跟踪所有参数,例如使用数组:

main

上面的程序还可以解决您遇到的另一个问题,当您创建总共四个线程但只加入两个线程时。