2016-08-01 120 views
3

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; 
} 

正在孕育线程同样的事情后,调用mainfree(arg); /安全吗?

+1

顺便说一句。你想在'for()'循环中调用2'pthread_create()'吗? – chux

回答

2

如果所有线程需要完全相同的参数,而且他们没有修改的说法,有没有需要动态地在所有分配它,而不是仅仅把它声明为在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; 
} 

上面也该方案解决了另一个问题,你有,当你创建总共四个线程,但只加入两个。

2

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

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

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

我打算接受Jaochim的回答,因为它也指出在这种情况下,没有必要动态分配它。但+1导致我们超级有用!谢谢 –