разделить очередь между родительским и дочерним процессами в c ++ - PullRequest
0 голосов
/ 13 июля 2010

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

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

Любые "простые старые структуры данных" (например, предоставляемые стандартной библиотекой C ++) являются чисто абстракциями памяти, поэтому их невозможно использовать для связи между двумя процессами. Для отправки данных из одного процесса в другой необходимо использовать один из нескольких системных вызовов, которые обеспечивают межпроцессное взаимодействие.

Но обратите внимание, что разделяемая память является исключением из этого. Вы можете использовать системные вызовы для настройки раздела общей памяти, а затем создавать структуры данных в общей памяти. Вам все еще нужно будет защитить эти структуры данных с помощью мьютекса, но мьютекс должен быть осведомлен о совместной памяти. В потоках Posix вы должны использовать pthread_mutexattr_init с атрибутом PTHREAD_PROCESS_SHARED.

2 голосов
/ 13 июля 2010

Простой ответ: Совместное использование std::queue двумя процессами может быть выполнено, но это не тривиально.

Вы можете использовать разделяемую память для удержания очереди вместе с некоторым механизмом синхронизации (обычно мьютексом). Обратите внимание, что в области общей памяти должен быть создан не только объект std::queue, но и содержимое очереди, поэтому вам придется предоставить собственный распределитель, который управляет созданием памяти в общей области.

Если вы можете, попробуйте взглянуть на библиотеки более высокого уровня, которые могут предоставить уже упакованные решения для ваших потребностей взаимодействия с процессами. Рассмотрим Boost.Interprocess или поищите в вашей любимой поисковой системе межпроцессное взаимодействие.

1 голос
/ 13 июля 2010

Я не думаю, что есть какие-то простые способы делить подобные структуры / объекты между двумя проектами. Если вы хотите реализовать очередь / список / массив / и т. Д. Между двумя процессами, вам необходимо реализовать какую-то связь между процессами для управления очередями, а также для извлечения и хранения записей.

Например, вы можете реализовать управление очередью в одном процессе и реализовать какой-либо IPC (разделяемая память, сокеты, каналы и т. Д.) Для передачи записей из одного процесса в другой.

Могут быть и другие методы, помимо стандартных библиотек C ++, которые сделают это за вас. Например, есть вероятные библиотеки Boost, которые уже реализуют это.

...