Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpSyMx 140 of 288 menu
◀ ▶

Замок взаимного исключения в Rust

Замок взаимного исключения хранит значение внутри и пускает к нему только одну линию за раз. Ожидание доступа возвращает результат: при успехе внутри лежит защитная оболочка, через которую можно читать и менять данные.

Создадим счетчик с нулем и увеличим его на единицу, пока оболочка жива:

use std::sync::Mutex; fn main() { let total = Mutex::new(0); match total.lock() { Ok(mut guard) => { *guard += 1; println!("{}", *guard); } Err(_) => println!("ожидание вернуло ошибку"), } }

На экране число 1. Звездочка перед guard берет число из оболочки, а присваивание через нее меняет защищенное значение. После конца блока оболочка исчезает и замок снова свободен.

Если другая линия оборвала работу, пока держала доступ, ожидание может вернуть ошибку. В учебном коде такую ветку обрабатывают отдельно и не продолжают менять данные вслепую:

use std::sync::Mutex; fn main() { let total = Mutex::new(5); match total.lock() { Ok(guard) => println!("{}", *guard), Err(_) => println!("ожидание вернуло ошибку"), } }

Дано число:

let num = 2;

Оберните литерал во взаимное исключение, увеличьте значение на единицу внутри успешной ветки ожидания и выведите результат.

Скажите, в какой момент замок снова становится свободным после увеличения счетчика в примере выше.

Дано число:

let num = 10;

Храните литерал под замком, прочитайте его через успешную ветку и выведите на экран. При ошибке ожидания напечатайте короткое сообщение без изменения числа.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить