2012-06-05 6 views
1

У меня есть процесс, который создает несколько потоков на основе аргумента, переданного процессу.Динамическое создание потоков и передача целого числа

producer_threads[num_threads]; 
for (id = 0; id < num_threads; id++) 
{ 
    printf("%d\n", id); 
    pthread_create(&producer_threads[id], NULL, &produce, (void *) &id); 
} 

Каждый поток идет в функцию продукции и сохраняет идентификатор в качестве локальной переменной

void* produce (void* args) 
{ 
    int my_id = * (int*) args; 
    printf("Thread %d started to produce\n", my_id); 
} 

Однако выход я получаю это, как показано

0 
1 
Thread <n> started to produce 
Thread <n> started to produce 

и п случайным образом либо 0 , 1 или 2. Я не уверен, что вызывает проблему, если это не потому, что глобальная переменная обновляется до того, как она назначена локально. Или потому, что «локальная переменная» делится между потоками.

ответ

3

Проблема в том, что вы передаете указатели на ту же переменную на каждый поток. Это создает условие гонки, при котором значение переменной, видимое каждым потоком, зависит от точного времени.

Если вы должны были передать аргумент нити значением, а не указателем, это устранило бы проблему.

1

Целое число должно быть переменной alloc'd вместо переменной стека. Поскольку вы передаете указатель на ячейку памяти в стеке, ваши результаты будут зависеть от времени (т. Е. Состояния гонки). Вам нужно передать разные переменные каждому вызову pthread_create.

Смежные вопросы