Что именно потокобезопасно в 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` теряет владение при копировании в локальную переменную, поэтому старый конфиг удаляется прямо во время использования
- Счётчик ссылок переполняется при частом копировании, из-за чего блок управления освобождается досрочно
