Вопрос по семафорам Unix

Есть ли способ с помощью семафоров unix установить их значения? Мне нужно всегда вызывать post() от нескольких потребителей и время от времени вызывать wait(), который будет ждать, пока не произойдет следующий post().

Как этого добиться?

Причина этого в том, что я реализую проблему производителя/потребителя (1 производитель/до 2 потребителей). У каждого потребителя есть внутренняя очередь, в которой он хранит элементы, которые, по-видимому, еще не могут быть помещены на выход, так как есть еще другие пакеты, отсутствующие у других потребителей, поэтому все они выводятся в правильном порядке (как они пришли от производителя) . Когда любая из очередей считается заполненной (скажем, с 10 элементами), я бы хотел, чтобы этот процесс ждал, пока другой процесс завершит свою работу (поскольку есть только 2 процесса, у меня есть гарантия, что пакет, который другой процесс yield — это пакет, который мне нужен, чтобы начать что-то выводить!).

Моя идея состоит в том, что каждый раз, когда потребитель что-то обрабатывает и ищет, чтобы поместить это в вывод, он должен вызывать что-то вроде post() на семафоре. Каждый раз, когда потребитель переполняет свою очередь, он должен выполнять что-то вроде wait() на том же семафоре. Таким образом, когда другой потребитель закончит свою работу, этот проснется.

Как следует решить эту ситуацию? Я на правильном пути? В этом проекте я ограничен использованием семафоров и общей памяти.

Конечно, идея состоит в том, чтобы как можно меньше вращаться.

Спасибо


person devoured elysium    schedule 07.12.2010    source источник


Ответы (2)


Кажется, что вам в основном нужен барьер для синхронизации ваших потребителей. Кажется, Posix дает его реализацию (pthread_barrier_*).

Так что создайте общий барьер с количеством потребителей; когда потребитель заканчивает, он должен «ждать у барьера».

В противном случае вы можете реализовать его с помощью другого семафора.

person Julio Guerra    schedule 07.12.2010
comment
Я застрял с процессами/семафорами, поэтому pthreads вне моих возможностей. Вы говорите, что я могу реализовать с другим семафором, и это очевидно — цель поста — узнать, как это сделать. - person devoured elysium; 07.12.2010
comment
Используете ли вы семафоры posix? - person Julio Guerra; 07.12.2010
comment
Я думаю да, хотя я не уверен на 100%. Я использую sem_wait/sem_post/sem_open и т. д. - person devoured elysium; 07.12.2010
comment
У вас есть реализация барьеров здесь: greenteapress.com/semaphores/downey05semaphores.pdf, но у вас есть чтобы иметь возможность инициализировать ваш семафор с заданным значением, он использует 2 семафора и целое число (количество потребителей). - person Julio Guerra; 07.12.2010
comment
Я понял. Спасибо за книгу! - person devoured elysium; 07.12.2010

Могу ли я предложить вам посмотреть это видео, предоставленное Стэнфордом на C Paradigms. Это, в частности, касается использования семафора производитель/потребитель.

person SiegeX    schedule 07.12.2010