TGViewer
C++ geek C++ geek @cpp_geek · 3.53K subscribers
Post #402 1.81K
🔒 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
  • 👍 8
  • ❤ 1
More from @cpp_geek
  1. Sep 24, 2026🎥 Вебинар по C++: Паттерн многопоточного программирования «Producer-Consumer» Когда неско…
  2. Sep 24, 2026Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введе…
  3. Sep 17, 2026В чем разница между git fetch и git pull? Разница между этими командами заключается в том,…
  4. Sep 15, 2026std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргумент…
  5. Sep 11, 2026move constructor Move-конструктор — это специальный конструктор, который позволяет эффекти…
  6. Sep 9, 2026Move-only объекты и почему std::unique_ptr нельзя копировать Многие удивляются, когда комп…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →