Увеличить очередь сообщений, не основанную на очереди сообщений POSIX?Невозможно выбрать (2)?
-
03-07-2019 - |
Вопрос
Я подумал, что воспользуюсь 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, я обязательно воспользуюсь этим способом :)