Лучший способ межпроцессного взаимодействия в C ++ - PullRequest
36 голосов
/ 16 декабря 2008

У меня есть два процесса, один из которых будет запрашивать данные у другого. За ограниченное время будет выполняться огромное количество запросов (10000 в секунду), а данные (> 100 МБ) будут передаваться в секунду. тип (двойной, целое) У меня вопрос, каким образом подключить этот процесс?

Общая память, очередь сообщений, lpc (вызов локальной процедуры) или другие ....

А также я хочу спросить, какую библиотеку вы предлагаете? Кстати, пожалуйста, не предлагайте MPI. редактировать: под windows xp 32 bit

Ответы [ 5 ]

39 голосов
/ 16 декабря 2008

Одно слово: Boost.InterProcess . Если это действительно нужно быстро, общая память - путь. У вас практически нет накладных расходов, поскольку операционная система выполняет обычное отображение между виртуальными и физическими адресами, и для данных не требуется копирование. Вы просто должны искать проблемы параллелизма.

Для фактической отправки команд, таких как shutdown и query , я бы использовал очереди сообщений. Ранее я использовал для этого сетевое программирование localhost и вручную распределял разделяемую память, прежде чем узнал о повышении. Черт, если бы мне нужно было переписать приложение, я бы сразу выбрал boost. Boost.InterProcess делает это проще для вас. Проверьте это.

6 голосов
/ 16 декабря 2008

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

4 голосов
/ 22 июля 2011

Если ваши данные состоят из нескольких типов и / или вам нужны такие вещи, как мьютекс, используйте Boost. Еще используйте общий раздел памяти, используя #pragma data_seg или файл с отображенной памятью.

3 голосов
/ 16 декабря 2008

Если вы используете разделяемую память, вам придется решить, вращаться или нет. Я ожидаю, что если вы используете семафор для синхронизации и хранения данных в разделяемой памяти, вы не получите большого выигрыша в производительности по сравнению с использованием очередей сообщений (при значительном ухудшении четкости), но если вы включите атомную переменную для синхронизации, то вы должны страдать от последствий этого.

3 голосов
/ 16 декабря 2008

Второе предложение Марка - я не стал бы беспокоиться о boost, если у вас нет проблем с переносимостью или вы не хотите делать классные вещи, такие как сопоставление стандартных типов контейнеров с общей памятью (в этом случае я бы определенно использовал boost).

В противном случае с очередями сообщений и разделяемой памятью справиться довольно просто.

...