Я новичок во всей концепции потоков и их исполнении. Я работаю над программой, чтобы понять, как они работают.Использование 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
Показать нас * точно * какой вывод вы получаете. –
На странице руководства '' sleep' (http://man7.org/linux/man-pages/man3/sleep.3.html): «**' sleep() '** может быть реализовано с использованием ** 'SIGALRM' **». У вас может быть только один «будильник» активен в * процессе * (если я не ошибаюсь). –
Printf не является потокобезопасным. Кроме того, у вас есть несколько потоков, выполняющих неатомную операцию на глобальном без мьютекса. –