На 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 переменные условия, общие для всех процессов. Смотрите мой ответ на ваш вопрос, связанный с мьютексом, чтобы определить, как. Ответ применим и к условным переменным.

Другие вопросы по тегам