2016-08-01 450 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導致我們超級有用!謝謝 –