Замок взаимного исключения в 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;
Храните литерал под замком, прочитайте его через успешную ветку и выведите на экран. При ошибке ожидания напечатайте короткое сообщение без изменения числа.