2013-03-11 3 views
0

В C вы можете создать многопроцессное приложение с помощью fork(), и затем вы сможете обмениваться данными с помощью FIFO-канала. Я узнал, что C++ поддерживает только многопоточные приложения, и если вы хотите использовать многопроцессорное приложение, вы должны положиться на fork().multi-process C++ fifo

Но в C++ проверка типов имеет решающее значение, поэтому я не могу просто передавать объекты через трубу без каких-либо рисков. Вы можете наложить на void* и спросить sizeof и отправить все через трубу, чтобы привести его обратно в исходный объект.

Так почему же это так плохо? Является многопроцессорной архитектурой, не используемой на C++, или есть библиотеки или лучшие способы делать что-то. Я немного искал Google, и единственное, что вы найдете, это многопоточный C++ или многопроцессорный C.

Причина, по которой требуется больше процессов, заключается в том, что я хочу, чтобы мое приложение было максимально надежным. Если мой веб-сервисный сбой, я хочу, чтобы мой основной процесс перезапустил его. Нет никакого способа сделать это многопоточным, так как вы никогда не знаете, если 1 поток не испортил память в другом потоке, поэтому, если вы получаете ошибку в одном потоке, вам нужно перезагрузить систему безопасности.

+0

Что вы подразумеваете под «мультипроцессом». * Многопроцессорность * - это гораздо более широкий термин, включая многопоточные, многопроцессорные и SIMD (однопоточные, но одновременно обрабатывающие несколько данных). Retagged с 'ipc', что подразумевает мультипроцесс. –

+0

Этот вопрос слишком широк. Вы указываете 'fork', затем' void * 'и' sizeof', многопоточность. – Ajay

+0

Это, безусловно, поможет понять, что ваши «объекты» вы хотите обработать. Насколько они велики, какие данные они содержат? –

ответ

0

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

0

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

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

Если, с другой стороны, ваши данные более сложные, содержащие какие-то ссылки на другие списки объектов динамической длины или тому подобное, тогда вы скоро столкнетесь с большими трудностями, используя простой приведение в действие void * и накачиваете бит данных по битовой стратегии. Таким образом, вам определенно потребуется более сложный подход при «сериализации» и «десериализации» ваших объектов.

Эти («сериализация» и «десериализация») является два термином вы могли бы хотеть исследовать дальше, чтобы найти подход, который наилучшим образом соответствует вашей проблеме.

Как вы скоро узнаете, это проблемы, к которым «решения» придумываются снова и снова с таким зоопарком таких стандартов, как XDR, используемый ВС RPC и ASN.1, чтобы назвать лишь некоторые из них, которые трудно чтобы узнать, какой из них лучше всего подходит для вашего случая использования.

Если вы собираетесь с C++ вы можете захотеть взглянуть на решение прирост может предложить (см: http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html)

Еще раз - если это только плоские структуры данных вы передаете назад и не беспокоиться о каких-либо накладных расходах такого рода и просто снимать данные по строке по частям.