2010-10-19 3 views
1

Если следующие части кода выполняются в том порядке, в котором я их поместил, могу ли я быть уверенным, что поток 1 пробуждается сначала потоком 3, позже с последующим потоком 2?Wait & Signal order

main: 
sem_init(&x,0,0); 

thread 1: 
sem_wait(&x); 

thread 2: 
sem_wait(&x); 

thread 3: 
sem_post(&x); 

ответ

1

Нет оснований для такого предположения. Это зависит от того, когда поток 1 и поток 2 invoquing sem_wait(), то есть на то, что они делают до и как планировщик дает им CPU для запуска. Если вы хотите, чтобы поток 1 будет разбужен до того нить 2, вам нужен еще один семафор:

main: 
sem_init(&x,0,0); 
sem_init(&y,0,0); 

thread 1: 
sem_wait(&x); 
sem_post(&y); 

thread 2: 
sem_wait(&y); 

thread 3: 
sem_post(&x); 
+1

Даже с этим кодом, следует понимать, что даже если поток 1 становится работоспособным до того нить 2 есть еще не обязательно является гарантией, что оно» ll планируется запустить перед потоком 2. Если есть работа, которую должен выполнить поток 1 перед тем, как запускается поток 2, тогда 'sem_post (& y)' (или эквивалент) необходимо выполнить потоком 1. –

+0

согласился. Я обновляю свой ответ. – mouviciel