Является ли Boost IPC хорошим?

Мой выбор по умолчанию для кросс-платформенного IPC будет повышаться, но я видел, как его критиковали на двух разных форумах, когда я спрашивал об этом, и это касалось меня. Возможно, это просто совпадение, так что же думают о повышении IPC и выборе кросс-платформенной библиотеки С++ IPC в целом?

Для Windows dev мы используем VС++ 2008 для справки.

edit: вот пример комментариев, которые я видел (не могу найти их все прямо сейчас):

для повышения, это дерьмо. По крайней мере, на окна. Мьютексы не используют WinAPI, вместо этого они создают Реализация на основе файлов (WinAPI = Kernel-объекты). Если ваша программа сбой файлы не будут удалены. При следующем запуске программы мьютекс не может быть создан из-за существующий файл.

Ответ 1

Из моего ограниченного опыта работы с Boost.Interprocess у меня не было серьезных проблем, но я не могу комментировать производительность. Хотя верно, что он использует файлы, созданные за пределами вашей папки программы, чтобы сделать свой материал, все они должны быть отображены в память, что отрицает большинство проблем с производительностью. В любом случае, когда вы используете IPC, вы всегда должны ожидать дополнительных накладных расходов.

Что касается критики, которую вы выделили, можно удалить именованный мьютекс или любые другие именованные ресурсы, оставшиеся лежащими вокруг предыдущего процесса (см. статический remove(const char*)). Чтобы быть справедливым, в зависимости от вашего приложения, может быть сложно использовать правильное решение, с которым вам не приходится иметь дело при использовании Windows API. С другой стороны, Windows API не переносится. Я предполагаю, что они используют файлы (даже если существует лучшая альтернатива), чтобы поддерживать интерфейс и поведение библиотеки согласованно на разных платформах.

В любом случае, названные mutexes - это лишь малая часть того, что предоставляет библиотека. Одной из наиболее полезных функций является то, что он предоставляет собственные диспетчеры памяти для области общей памяти, которая включает распределители STL. Мне лично приятно работать с конструкциями высокого уровня, которые он обеспечивает с необработанной памятью.


ОБНОВЛЕНИЕ: Я сделал еще несколько копаний в документации Boost, и я наткнулся на различные интересные биты tid:

Эта страница дает более подробную информацию о реализации и характеристиках библиотеки, но не включает в себя обоснование реализации.

В этой ссылке четко указано, что их реализация mutex в Windows может использовать некоторую работу (версия 1.46). Если вы копаете немного дальше в папке boost\interprocess\sync, вы увидите еще две папки с именем posix и emulation. Оба они содержат детали реализации для примитива синхронизации. Реализация posix для interprocess_mutex::lock - это то, что вы ожидаете, но реализация эмуляции довольно простая:

// Taken from Boost 1.40.
inline void interprocess_mutex::lock(void)
{
   do{
      boost::uint32_t prev_s = detail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);

      if (m_s == 1 && prev_s == 0){
            break;
      }
      // relinquish current timeslice
      detail::thread_yield();
   }while (true);
}

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

Ответ 2

Это не прямой ответ на ваш вопрос, а альтернатива: если у вас есть выбор в среде dev, вы можете рассмотреть Qt и D- реализация шины в Qt.