Ваш анализ вполне корректен. Сначала взгляните на этот вопрос о OpenMP и std::atomic
. Обратите внимание, что std::shared_ptr
не обязательно , реализованный с использованием атомики. Это также относится к общему блоку управления, который изменяется во время операций копирования. Есть пара случаев:
- Вызов
get
/ operator->
/ operator*
с одним shared_ptr
на поток, который указывает на тот же объект. Только выполнение операций только для чтения на целевом объекте. Это настолько безопасно, насколько это возможно, учитывая разрыв в спецификации между C ++ 11 и OpenMP. Операции блока управления не выполняются. Я бы сказал, что это не отличается от использования необработанного указателя.
- Вызов
get
/ operator->
/ operator*
на одном общем shared_ptr
из нескольких потоков. Это все еще так же безопасно.
- Копирование / удаление локального потока
shared_ptr
s, который указывает на разные объекты в нескольких потоках. Это все еще должно быть настолько безопасно, насколько это возможно, поскольку нет общей даты.
- Копирование / удаление локальных потоков
shared_ptr
s, которые указывают на один и тот же объект из нескольких потоков. Теперь мы знаем, что это касается даты общего контроля, но она безопасна в соответствии со стандартом C ++. Аргумент для std::atomic
/ OpenMP применяется. Это практически безопасно, но не очень четко определено.
- Изменение (
reset
) общего потока shared_ptr
в нескольких потоках. Это небезопасно. atomic<shared_ptr>
можно использовать здесь, но тогда применяется тот же аргумент.
Я бы сделал еще одно различие. Если вы рассматриваете возможность использования std::atomic
с OpenMP, есть альтернатива использованию OpenMP-idiomatic pragma omp atomic
- нет OpenMP, эквивалентного shared_ptr
. Так что если не считать реализации собственного shared_ptr
поверх omp atomic
, у вас на самом деле нет выбора.