Порядок ожидания и сигнала - PullRequest
1 голос
/ 19 октября 2010

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

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

thread 1:
sem_wait(&x);

thread 2:
sem_wait(&x);

thread 3:
sem_post(&x);

1 Ответ

1 голос
/ 19 октября 2010

Нет оснований делать такое предположение.Это зависит от того, когда поток 1 и поток 2 вызывают sem_wait (), т. Е. От того, что они делают раньше, и от того, как планировщик предоставляет им ЦП для работы.Если вы хотите, чтобы поток 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);
...