Er. boost::shared_ptr
определенно не поточно-ориентированный. По крайней мере, не более поточно-ориентированный, чем, например, std::vector
. Вы можете читать boost::shared_ptr
из нескольких потоков, но как только какой-либо поток записывает boost::shared_ptr
, он должен синхронизироваться с другими авторами и читателями.
И нет, вы не можете использовать его в общей памяти, он никогда не был предназначен для этого. Например. он использует так называемый объект «с общим счетом», в котором хранится счетчик ссылок и средство удаления, и этот объект с общим счетом выделяется кодом shared_ptr
, поэтому он не будет находиться в общей памяти. Кроме того, код shared_ptr
(и метаданные, такие как vtables) могут находиться по совершенно разным адресам в разных процессах, поэтому любой вызов виртуальной функции также будет проблемой (и IIRC shared_ptr
использует виртуальные функции внутри - или, по крайней мере, указатели на функции, что приводит к той же проблеме).
Я не знаю , если boost::interprocess::shared_ptr
безопасен для межпроцессных процессов, но я уверен, что это не так. Межпроцессная синхронизация довольно дорогая. Если boost::interprocess::shared_ptr
, а не , это позволяет пользователю блокировать доступ к общим данным. Таким образом, высокая стоимость синхронизации оплачивается только один раз за несколько обращений подряд.
РЕДАКТИРОВАТЬ: Я бы ожидал , что шаблон использования, на который ссылался Имон Нербонн в своем комментарии (который является потокобезопасным с boost::shared_ptr
), также в порядке с boost::interprocess::shared_ptr
. Хотя точно сказать не могу.