На MacOSX, в C++, как выполнить межпроцессное взаимодействие через разделяемую память без спин-блокировки?
У меня есть два процесса:
Producer
and
Consumer
у них есть общая mmaped общая область памяти
Memory
Теперь продюсер пишет вещи в память. Потребитель читает вещи из памяти.
I would prefer Consumer not to spin wait with Memory is empty.
I would prefer Producer not to spin wait when Memory is full.
Как мне этого добиться?
2 ответа
Как насчет использования мьютексов? поскольку мьютекс будет спать до тех пор, пока ресурс не станет доступным, у вас не возникнет проблемы с ожиданием вращения.
Это напоминает проблему столовых философов. Если ваша платформа поддерживает это, вы можете использовать условные переменные,совместно используемые несколькими процессами. С такими общими условными переменными ваш Producer
мог бы сигнализировать ваш Consumer
читать Memory
когда данные доступны, и наоборот, когда Memory
пустой. Не забудьте проверить на ложное пробуждение.
Вам нужно проверить, поддерживает ли реализация MacOSX pthread переменные условия, общие для всех процессов. Смотрите мой ответ на ваш вопрос, связанный с мьютексом, чтобы определить, как. Ответ применим и к условным переменным.