将参数传递给多个线程

Pass argument to multiple threads

C 的新手,我正在阅读 here 关于如何正确地将参数传递给线程的内容。如果需要将此参数传递给多个线程怎么办? Where/how 我应该使用 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;
}

在生成线程后在 main 中调用 free(arg); 是否相同/安全?

您需要确保两个线程都已完成,然后再调用 free(arg)

这意味着您可以在 在两个线程上调用 pthread_join 之后 执行此操作。

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

如果所有线程都需要完全相同的参数,并且它们没有修改参数,则根本不需要动态分配它,而只需在 main 函数中将其声明为函数范围内的变量.如果没有动态分配,就不需要释放它。

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

// Rest of program...

#define NUMBER_OF_ITERATIONS 2

int main(void)
{
    int args[NUMBER_OF_ITERATIONS];
    pthread_t threads[NUMBER_OF_ITERATIONS][2];

    // Create threads
    for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
    {
        args[i] = i;
        pthread_create(&threads[i][0], NULL, foo, &args[i]);
        pthread_create(&threads[i][1], NULL, bar, &args[i]);
    }

    // Wait for threads to finish
    for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
    {
        pthread_join(threads[i][0]);
        pthread_join(threads[i][1]);
    }

    return 0;
}

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