OpenMP и shared_ptr - PullRequest
       17

OpenMP и shared_ptr

0 голосов
/ 08 ноября 2018

Безопасно ли каким-либо образом использовать shared_ptr внутри параллельного блока OpenMP? A shared_ptr поддерживает атомарность подсчета ссылок с помощью атомарного метода, и в целом я понимаю, что мы не должны смешивать многопоточные механизмы C ++ 11 с OpenMP. Так что по определению мне кажется, что доступ к shared_ptr в любом месте внутри блока pragma omp (даже для простых операций чтения const) может вызвать проблемы. Или это не тот случай?

1 Ответ

0 голосов
/ 09 ноября 2018

Ваш анализ вполне корректен. Сначала взгляните на этот вопрос о 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, у вас на самом деле нет выбора.

...