«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Является ли std::shared_ptr действительно потокобезопасным, и как насчет одновременных изменений указанного объекта?

Является ли std::shared_ptr действительно потокобезопасным, и как насчет одновременных изменений указанного объекта?

Опубликовано 7 января 2025 г.
Просматривать:271

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

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

Утверждение, которое вы процитировали из MSDN относительно потокобезопасности std::shared_ptr, может быть неверно истолковано. Это означает, что, хотя несколько потоков могут одновременно читать и записывать отдельные объекты Shared_ptr, это не гарантирует безопасность изменения самого объекта Shared_ptr.

TL;DR:

Потокобезопасность std::shared_ptr касается только управления несколькими указателями, указывающими на один и тот же базовый объект. Он не распространяется на содержимое общего объекта или одновременную запись в экземплярshared_ptr.

Разбивка:

Внутренне общий_ptr состоит из двух компонентов:

  • Блок управления: управляет счетчиком ссылок Shared_ptr и обеспечивает правильное уничтожение указанного объекта. Этот компонент является потокобезопасным.
  • Pointed Object: фактическая структура данных или общий объект. Потокобезопасность этого объекта зависит от его реализации.

Пример:

В фрагменте кода global — это общий указатель на объект конфигурации. Поток 1 копирует глобальный объект в свой общий указатель, закрытый. Если бы поток 2 впоследствии изменил глобальный, частный все равно будет указывать на исходный объект конфигурации, поскольку блок управления не изменяется. Однако если поток 2 назначит новый объект конфигурации глобальным, частный останется указателем на исходный объект.

Потокобезопасность указанных объектов:

Возможность безопасного изменение указанного объекта с помощью нескольких потоков зависит от реализации объекта. В случае вашего класса конфигурации, если он допускает одновременную запись без синхронизации, например добавление или удаление настроек, код не будет потокобезопасным.

Решение:

Чтобы обеспечить потокобезопасность при изменении объекта, используйте механизмы синхронизации, такие как std::mutex, для защиты доступа к объектуshared_ptr или самому общему объекту.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3