Межпроцессное блокирование чтения / записи мьютекса

Я пытаюсь сделать межпроцессное взаимодействие в C / C ++ в среде Windows.

Я создаю файл страницы общей памяти, и два процесса получают дескриптор этого файла. Это вот так:

Процесс 1: Инициализация области общей памяти. Подождите, пока Process2 заполнит его.

Process2: получить дескриптор в общую область памяти. Положите вещи в это.

Я также создаю именованный мьютекс в process1. Теперь process1 получает владение мьютексом вскоре после его создания (используя WaitSingleObject). Очевидно, что в области памяти ничего нет, поэтому мне нужно освободить мьютекс. Теперь мне нужно подождать, пока память заполнится, вместо того, чтобы снова пытаться получить мьютекс.

Я думал об условных переменных. Process2 сообщает переменную условия, как только она заполняет область памяти, и process1 немедленно получает информацию.

Однако в соответствии с документацией MS по условным переменным они не являются общими для процессов, что ясно из их инициализации, поскольку они не являются named,

Кроме того, область общей памяти может содержать до одного элемента в любой данный момент, что означает, что process2 не может пополнить после его заполнения, пока process1 не извлечет свою информацию.

Из приведенного описания ясно, что условные переменные являются лучшими для этой цели (или мониторами). Так есть ли способ обойти это?

0

Решение

Условные переменные могут использоваться в процессе, но не во всех процессах.

Попробуйте NamedPipe с PIPE_ACCESS_DUPLEX как открытый режим. Так что у вас есть варианты общения из обоих процессов.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx

1

Другие решения

Мьютекс (как и большинство примитивов синхронизации) — это объект для каждого процесса, который должен использоваться разными потоки в том же процессе. Вы не можете поделиться этим между процессами (по крайней мере, в Unix).

Чтобы синхронизировать вещи между различными процессами, вам нужно использовать какой-то механизм IPC для связи.

0

Я использовал события для этого раньше. Используйте 2 именованных события автоматического сброса. 1 событие готовности данных и одно событие готовности буфера. Writer ожидает готовности буфера, записывает данные и устанавливает событие готовности данных. Считыватель ожидает события готовности данных, считывает память и устанавливает событие готовности буфера. Если все сделано правильно, вам не нужен мьютекс.

0
По вопросам рекламы [email protected]