Как заблокировать поток с помощью семафоров с предмитивом ИЛИ? - PullRequest
0 голосов
/ 02 сентября 2018

Я рассматриваю пример для дальнейшей оценки моего вопроса. Рассмотрим три потока: T_1, T_2 и T_3.

  • Если T_2 не может быть выполнен до тех пор, пока T_1 не закончит свой основной сегмент, тогда я просто сделаю semwait () в начале T_2 и установлю semsignal () того же семафора.
  • Если T_2 не может выполняться до тех пор, пока T_1 И T_3 не закончат свой основной сегмент кода, тогда я просто заставлю T_2 ждать двух функций semsignal (), каждая в конце T_1 и T_3.

Но что, если T_2 не может выполняться, пока T_1 ИЛИ T_3 не закончили свой основной сегмент кода? Если я заставлю его ждать какую-то функцию ИЛИ, она, скорее всего, будет заблокирована в первом выражении, даже не проверяя второе, если T_1 не разрешает его запуск, а T_3 делает. Итак, мой вопрос: как я могу заставить его ждать такого состояния?

1 Ответ

0 голосов
/ 03 сентября 2018

ты можешь так делать?

Т2

...
sem_wait(s1)

Т1, Т3

...
mutex_lock(m1)
if (!signaled) {
    sem_signal(s1)
    signaled = true;
}
mutex_unlock(m1)
...