Надежно ли работает boost :: interprocess? - PullRequest
5 голосов
/ 13 февраля 2012

В настоящее время у меня есть 2 процесса, которые взаимодействуют с использованием формы сообщений message_queue и shared_memory. Все работает, как присутствовал.

Теперь мне нужно сделать один из этих процессов многопоточным (спасибо еще раз за повышение), и мне было интересно, нужно ли мне использовать механизм защиты между потоками (например, мьютекс), или уже есть библиотека boost :: interprocess библиотека обеспечивает механизм защиты?

Я не нашел никакой информации об этом в документации буста. Кстати, я использую Boost 1.40.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

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

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

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

[Boost info для стабильной версии: 1.48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[Увеличить информацию о версии, которую вы используете: 1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

При использовании совместно используемой памяти обычной практикой является размещение механизма синхронизации у основания сегмента совместно используемой памяти, где он может быть анонимным (то есть ядро ​​ОС не предоставляет доступ к нему по имени). Таким образом, все процессы знают, как заблокировать сегмент совместно используемой памяти, и вы можете связать блокировки с их сегментами (например, если у вас их было несколько)

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

Пожалуйста, убедитесь, что если вы решите использовать мьютекс, то он является мьютексом между процессами (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html), в отличие от мьютекса в библиотеке потоков потоков, который предназначен для одного процесса с несколькими потоками.

1 голос
/ 14 февраля 2012

Вы должны убедиться, что заблокировали общие ресурсы.

Примеры можно найти в документации повышения.Например:

http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock

...