Ожидание на нескольких семафорах без занятого ожидания (C/C++ Linux)

Если у меня более одного семафора, как я могу иметь блок процесса, пока хотя бы один из семафоров не освободится? Я знаю, что могу сделать это с помощью цикла ожидания ожидания, такого как:

// blocks until one of the semaphores in sems is free, returns
// index of semaphore that was available
int multiple_sem_wait(sem_t **sems, int num_sems) {
   while (true) {
      for (int i = 0; i < num_sems; ++i) {
         if (sem_trywait(sems[i]) == 0) {
            return i;
         }
      }
   }
}

Но есть ли способ сделать это без занятой петли? Возможно, есть какой-то метод IPC, кроме семафоров, который я должен использовать?

Спасибо

2 ответа

Решение

Здесь (developers.sun.com) короткая статья от Sun о том, как они реализовали свои WaitForMultipleObjects эмуляция в солярисе. Основная идея состоит в том, чтобы связать список переменных условия с дескриптором (защищенным мьютексом) и сигнализировать все переменные условия всякий раз, когда дескриптор сигнализируется. Каждый раз, когда вы вызываете эмулируемый WaitForMultipleObjectsновая переменная условия создается и добавляется в список всех дескрипторов, которые вас интересуют. WaitForMultipleObjects эмуляция, вы блокируете переменную условия и проверяете каждый из своих дескрипторов, когда просыпаетесь.

Причина наличия списка переменных условий (а не одной) состоит в том, что у вас могут быть два потока, блокирующих дескрипторы: поток 1 заблокирован на A и B, а поток 2 заблокирован на A и C. Сигнализация B должна не просыпаюсь веткой 2. С каждым звонком WaitForMultipleObjects создайте новую переменную условия, в этом сценарии B и C будут иметь по одной отдельной переменной условия, а A будет иметь обе переменные условия.

Для более подробной информации, вам нужно прочитать саму статью.

Используйте несколько отдельных потоков официантов, как в:

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