Ожидание на нескольких семафорах без занятого ожидания (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 будет иметь обе переменные условия.
Для более подробной информации, вам нужно прочитать саму статью.
Используйте несколько отдельных потоков официантов, как в:
- Каждый поток ожидает отдельный семафор.
- После успешного ожидания на семафоре любой заданный поток официанта сигнализирует (через другой семафор, переменную условия или любой другой примитив, который наиболее удобен) потоку, который хочет "ждать на нескольких семафорах".