2015-04-11 3 views
1

Я новичок во всей концепции потоков и их исполнении. Я работаю над программой, чтобы понять, как они работают.Использование sleep() в потоках

Вот код, у меня есть:

#include <stdio.h> 
#include <pthread.h> 
int glob; 
void *child(void *t); 
pthread_t thread[10]; 


void *child(void *t) 
{ 
    // Increment glob by 1, wait for 1 second, then increment by 1 again. 
    printf("Child %d entering. Glob is currently %d\n", t, glob); 
    glob++; 
    sleep(1); 
    glob++; 

    printf("Child %d exiting. Glob is currently %d\n", t, glob); 
} 
int main() 
{ 
    int i; 
    glob=0; 
    for(i=0; i<10; i++) 
    { 
     pthread_create(&thread[i], NULL, child, (void *) i) ; 
    } 
    printf("Final value of glob is %d\n", glob); 
    return 0; 
} 

Хотя я понимаю, что время их исполнения непредсказуемы. И поэтому печать и обновление glob будут испорчены. Но почему последняя часть нитей, после сна (1) вообще не выполняется?

Любая помощь приветствуется.

Моего выходного тока:

Child 0 entering. Glob is currently 0 
Child 3 entering. Glob is currently 0 
Child 2 entering. Glob is currently 0 
Child 1 entering. Glob is currently 0 
Child 4 entering. Glob is currently 3 
Child 5 entering. Glob is currently 5 
Child 6 entering. Glob is currently 6 
Child 7 entering. Glob is currently 7 
Child 8 entering. Glob is currently 8 
Final value of glob is 9 
Child 9 entering. Glob is currently 9 
+0

Показать нас * точно * какой вывод вы получаете. –

+0

На странице руководства '' sleep' (http://man7.org/linux/man-pages/man3/sleep.3.html): «**' sleep() '** может быть реализовано с использованием ** 'SIGALRM' **». У вас может быть только один «будильник» активен в * процессе * (если я не ошибаюсь). –

+0

Printf не является потокобезопасным. Кроме того, у вас есть несколько потоков, выполняющих неатомную операцию на глобальном без мьютекса. –

ответ

3

Поскольку ваш основной поток не ждет резьбы, вполне вероятно, что основные нити выходят до нитей могли печатать детали после sleep(). Следовательно, выход из всего процесса.

Позвоните pthread_join() из основного для всех потоков, и вы увидите распечатку printf после сна(). Как вы уже знаете, есть состояние гонки при обновлении glob всеми темами. Таким образом, вы не можете больше понимать эту программу.

+0

Или используйте 'pthread_exit' для выхода из' main' вместо 'return'. Но, очевидно, это тоже не поможет вашему состоянию гонки. –