В предыдущей статье мы разобрали гонку данных в C++: десять потоков увеличивают общий счётчик, но без синхронизации программа может работать некорректно. Теперь решим ту же задачу на Rust. Разберём, как модель владения и система типов помогают предотвращать небезопасный доступ к общим данным, зачем нужны Arc, Mutex и AtomicUsize, а также какую роль играют Send и Sync. На практических примерах сравним независимые вычисления, совместное изменение состояния и ожидание событий через Condvar. Отдель…