Выбор ответа Senior RAII и умные указатели обновлено

Потокобезопасность shared_ptr

Вопрос

Что верно про std::shared_ptr в многопоточном коде?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Счётчик атомарный, но запись в один экземпляр и доступ к объекту нужно синхронизировать. Управляющий блок использует атомарные операции, поэтому разные потоки могут копировать и уничтожать разные экземпляры, указывающие на один объект.

Варианты ответа

  1. shared_ptr полностью потокобезопасен, включая объект, на который указывает
  2. shared_ptr вообще не потокобезопасен: даже копировать разные экземпляры нельзя
  3. Потокобезопасность счётчика включается только при создании через make_shared
  4. Счётчик атомарный, но запись в один экземпляр и доступ к объекту нужно синхронизироватьправильный ответ

Разбор

Управляющий блок использует атомарные операции, поэтому разные потоки могут копировать и уничтожать разные экземпляры, указывающие на один объект. Но если два потока пишут в один экземпляр (p = other), это гонка данных; для такого есть std::atomic<std::shared_ptr<T>> (C++20). Объект же защищается как обычно: мьютексом или неизменяемостью.

  • Объект не становится потокобезопасным от того, что им владеет shared_ptr.
  • Копирование разных экземпляров безопасно.
  • Способ создания на потокобезопасность счётчиков не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.