Использование shared_ptr в многопоточном контексте требует определённой осторожности, поскольку он сам по себе имеет ограниченную потокобезопасность. Рассмотрим подробнее, что это значит и как можно безопасно использовать его в многопоточной среде.
🚩Потокобезопасность
🟠Безопасное копирование и удаление
Стандарт C++ гарантирует, что операции копирования и удаления
shared_ptr являются потокобезопасными в том смысле, что вы можете безопасно копировать и удалять разные экземпляры shared_ptr из разных потоков, даже если они указывают на один и тот же объект.🟠Счётчик ссылок
Модификации счётчика ссылок в нем (т.е. увеличение и уменьшение) являются атомарными операциями, что означает, что при изменении счётчика из разных потоков состояние счётчика останется консистентным и корректным.
🟠Ограничения потокобезопасности
Не рекомендуется изменять сам объект, на который указывает
shared_ptr, из нескольких потоков без дополнительной синхронизации, так как shared_ptr не предоставляет потокобезопасность для доступа к объекту. Если несколько потоков изменяют один и тот же shared_ptr (не копии), например, присваивают ему новые значения или обнуляют его, это должно синхронизироваться, так как стандартная библиотека не гарантирует безопасность таких операций без внешней синхронизации.🚩Рекомендации для использования в многопоточной среде
🟠Избегайте разделять один и тот же `shared_ptr` между потоками
Лучше дать каждому потоку собственную копию
shared_ptr, что позволяет избежать конфликтов на запись.🟠Синхронизируйте доступ к общему
shared_ptrЕсли несколько потоков должны иметь доступ к одному и тому же
shared_ptr, используйте мьютексы или другие механизмы синхронизации для защиты его при записи.🟠Рассмотрите использование
std::atomic<std::shared_ptr<T>> для C++20 и вышеЭта оболочка предоставляет потокобезопасные операции на
shared_ptr без необходимости явной синхронизации при изменении указателя.Ставь 👍 и забирай 📚 Базу знаний