1.7Kпросмотров
45.6%от подписчиков
29 января 2026 г.
Score: 1.8K
🔒 const в C++: Скрытый смысл, о котором молчат Мы привыкли думать, что const после имени метода это просто защита от дурака: "Я обещаю не менять поля класса внутри этой функции". Но в современном C++ (и в стандартной библиотеке STL) const означает нечто большее. Это контракт потокобезопасности (Thread Safety Contract). 🧵 Золотое правило STL: 1. const методы можно вызывать из разных потоков одновременно без блокировок. (Safe for concurrent reads). 2. Не-const методы требуют внешней синхронизации, если их вызывают несколько потоков. 🚨 Где кроется ловушка? Ловушка в ключевом слове mutable.
Оно позволяет менять поля даже внутри const метода. Обычно это используют для кэширования или ленивых вычислений. ❌ ОПАСНЫЙ КОД (Логический const, но физическая гонка): class Widget { mutable int cachedValue_ = -1; // Можно менять в const методе public: // Метод помечен const. Пользователь думает, что он безопасен // для вызова из 10 потоков одновременно. int GetValue() const { if (cachedValue_ == -1) { // 💥 DATA RACE! // Два потока могут одновременно зайти сюда и начать писать. cachedValue_ = HeavyCalculation(); } return cachedValue_; }
}; Если вы пишете библиотеку и помечаете метод как const, пользователи будут вызывать его параллельно, не используя мьютексы. Если внутри у вас есть несинхронизированный mutable - программа упадет. ✅ Правильный подход: Если вы используете mutable, вы обязаны защитить его мьютексом. class Widget { mutable std::mutex mtx_; // Мьютекс тоже должен быть mutable! mutable int cachedValue_ = -1; public: int GetValue() const { std::lock_guard<std::mutex> lock(mtx_); // Блокируем поток if (cachedValue_ == -1) { cachedValue_ = HeavyCalculation(); } return cachedValue_; }
}; 💡 Итог: В C++ const - это не только "я не меняю данные". Это обещание: "Этот метод безопасен для одновременного вызова". Если вы нарушаете это обещание (используя mutable без защиты), вы создаете бомбу замедленного действия. #cpp #multithreading #const #safety #coding #tips ➡️ @cpp_geek