Увеличить очередь сообщений, не основанную на очереди сообщений POSIX?Невозможно выбрать (2)?

StackOverflow https://stackoverflow.com/questions/408059

Вопрос

Я подумал, что воспользуюсь Boost.Interprocess's Очередь сообщений вместо сокетов для связи внутри одного хоста.Но после того, как я покопался в этом, кажется, что эта библиотека по какой-то причине избегает возможности очереди сообщений POSIX (которую поддерживает моя система Linux), и вместо этого реализована поверх разделяемой памяти POSIX.Интерфейс достаточно похож, чтобы вы могли не сразу догадаться об этом, но, похоже, это так.

Недостатком для меня является то, что общая память, полученная с помощью shm_open(3) похоже, его нельзя использовать с select(2), в отличие от очередей сообщений POSIX , полученных с помощью mq_open(3).

Похоже, что библиотека Boost в этом случае проигрывает.Кто-нибудь понимает, знает, почему так должно быть?Даже если очереди сообщений it POSIX доступны только в некоторых системах, я бы ожидал, что Boost будет использовать это средство там, где оно доступно, и переопределять его только там, где это необходимо.Есть ли какая-то ошибка в системе POSIX, которую я пока не распознаю?

Это было полезно?

Решение

На днях я столкнулся с аналогичной ситуацией при использовании Boost.Классы синхронизации Interprocess:а именно класс условий.Это реализовано "общим" способом, но способ, которым это было сделано, заключается в использовании пользовательского spinlock, который весьма неэффективно (по крайней мере, в OS X).По сути, это делало классы синхронизации бесполезными.

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

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

Другие советы

Да, к сожалению, это не так.Я тоже был разочарован, когда понял, что после раскопок источников.

Но вот другая (хорошая) сторона этого факта:если ваша программа использует boost::asio, вы можете обернуть API очередей сообщений POSIX следующим образом просто еще один дейтаграмма источник данных и это (ИМХО) было бы еще лучше использовать, если бы это было частью boost::interprocess...это было бы довольно нетривиально, но (ИМХО) определенно заслуживает этого, поэтому вы можете работать с MQ унифицированным способом и использовать сила из других boost::asio всякое такое...

...в моем следующем проекте, если мне снова понадобится POSIX MQ, я обязательно воспользуюсь этим способом :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top