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

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

// 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 ]

5 голосов
/ 16 октября 2011

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

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

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

0 голосов
/ 16 октября 2011

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

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