Общие ресурсы из boost::interprocess (общая память и т. д.) требуют, чтобы вы обеспечили необходимую синхронизацию. Причина этого в том, что вам может не потребоваться синхронизация, и обычно это довольно дорогая операция с точки зрения производительности.
Скажем, например, что у вас есть процесс, который записывает в разделяемую память текущую статистику чего-то в 32-битном целочисленном формате, и несколько процессов, которые считывают эти значения. Поскольку значения представляют собой целые числа (и, следовательно, на вашей платформе операции чтения и записи являются атомарными), и у вас есть один процесс, записывающий их, и несколько процессов, читающих их, для этой схемы синхронизация не требуется.
Однако в некоторых примерах вам потребуется синхронизация, например, если в приведенном выше примере было несколько авторов или если вместо целых чисел вы использовали строковые данные. Внутри буста есть различные механизмы синхронизации (а также не бустовые, но так как вы уже используете буст), описанные здесь:
[Информация о повышении для стабильной версии: 1.48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html
[Информация о Boost для версии, которую вы используете: 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), а не мьютекс в библиотеке потоков boost, который предназначен для одного процесса с несколькими потоками.
person
user1215153
schedule
17.02.2012