Вступить в клуб →
сложнаявопросМногопоточность и синхронизация

Что именно потокобезопасно в shared_ptr

Конфигурация сервиса лежит в std::shared_ptr<Config> g_config. Поток обновления раз в минуту делает g_config = load_config();, рабочие потоки читают auto c = g_config; use(*c);.

Авторы уверены: shared_ptr потокобезопасен, поэтому синхронизация не нужна. Изредка сервис падает в момент перезагрузки конфига. Как объяснить?

  • Атомарен только счётчик ссылок; сама переменная `g_config` — обычный объект, её одновременные чтение и запись — гонка данных
  • Гонка возникает в самом объекте `Config`: одновременное чтение его полей несколькими потоками небезопасно и требует мьютекса или копии на поток
  • `shared_ptr` теряет владение при копировании в локальную переменную, поэтому старый конфиг удаляется прямо во время использования
  • Счётчик ссылок переполняется при частом копировании, из-за чего блок управления освобождается досрочно

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела