Является ли boost::interprocess потокобезопасным?

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

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

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

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


person Tom97531    schedule 13.02.2012    source источник
comment
Вы читали boost.org/doc/libs/1_40_0 /doc/html/interprocess/ ?   -  person Quentin Pradet    schedule 14.02.2012


Ответы (2)


Общие ресурсы из 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
comment
+1 за Поскольку значения являются целыми числами (и, следовательно, на вашей платформе операции чтения и записи являются атомарными), и у вас есть один процесс, записывающий их, и несколько процессов, читающих их, для этого дизайна не требуется синхронизация. - person FaceBro; 22.08.2017

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

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

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

person Akos    schedule 13.02.2012
comment
Так что, если я правильно понимаю, нет никакого механизма защиты. Вы должны явно защитить свою память и очередь. - person Tom97531; 14.02.2012