Лучший способ для межпроцессного общения на С++
У меня есть два процесса, которые будут запрашивать другие данные. В течение ограниченного времени (10000 в секунду) будет производиться огромное количество запросов, а данные ( > 100 мб) будут передаваться в секунду. Тип данных будет интегральным тип (двойной, целое)
Мой вопрос заключается в том, каким образом связать этот процесс?
Общая память, очередь сообщений, lpc (Локальный вызов процедуры) или другие.
А также я хочу спросить, какую библиотеку вы предлагаете? кстати, пожалуйста, не предлагайте MPI.
изменить: под windows xp 32 бит
Ответы
Ответ 1
Одно слово: Boost.InterProcess. Если это действительно нужно быть быстрым, общая память - это путь. У вас почти есть нулевые служебные данные, поскольку операционная система выполняет обычное сопоставление между виртуальными и физическими адресами, и для данных не требуется копирование. Вам просто нужно искать проблемы concurrency.
Для отправки команд, таких как shutdown и query, я бы использовал очереди сообщений. Я ранее использовал локальное сетевое программирование для этого и использовал распределение разделяемой памяти вручную, прежде чем я узнал о повышении. Черт, если мне нужно будет переписать приложение, я сразу же подберу бунт. Boost.InterProcess делает это более легким для вас. Проверьте это.
Ответ 2
Я бы использовал разделяемую память для хранения данных и очередей сообщений для отправки запросов.
Ответ 3
Если ваши данные состоят из нескольких типов и/или вам нужны такие вещи, как мьютексы, используйте Boost.
Else используют общий раздел памяти с помощью #pragma data_seg или файла с отображением памяти.
Ответ 4
Я добавлю второе предложение Marc - я бы не стал беспокоиться о повышении, если у вас нет проблемы с переносимостью или вы хотите делать классные вещи, такие как стандартные типы контейнеров по сравнению с разделяемой памятью (в этом случае я бы определенно использовал boost).
В противном случае очереди сообщений и разделяемая память довольно просты.
Ответ 5
Если вы используете разделяемую память, вам придется решать, вращаться или нет. Я бы ожидал, что если вы используете семафор для синхронизации и хранения данных в общей памяти, вы не получите большого преимущества в производительности по сравнению с использованием очередей сообщений (при значительной деградации ясности), но если вы закрутите атомную переменную для синхронизации, тогда вы должны пострадать от последствий этого.