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