2016-08-01 2 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; 
} 

зовет free(arg); в main после нереста нити такой же вещь/безопасно?

+1

BTW. Хотите ли вы, чтобы 2 'pthread_create()' вызывал внутри цикла 'for()'? – 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 потому что это нам очень полезно! благодаря –