Замок чтения и записи в Rust
Замок чтения и записи удобен, когда данные часто смотрят, но редко меняют. Несколько линий могут одновременно взять доступ на чтение, а запись ждет, пока все читатели отпустят оболочки.
Проверим два чтения одного числа без ожидания друг друга:
use std::sync::RwLock;
fn main() {
let data = RwLock::new(10);
match data.read() {
Ok(first) => match data.read() {
Ok(second) => println!("{} {}", *first, *second),
Err(_) => println!("ожидание вернуло ошибку"),
},
Err(_) => println!("ожидание вернуло ошибку"),
}
}
На экране два раза 10. Пока живут
first и second, новый
писатель не войдет, но третий читатель
еще может подключиться.
Запись берут отдельным ожиданием и меняют значение, когда читателей больше нет:
use std::sync::RwLock;
fn main() {
let data = RwLock::new(3);
match data.write() {
Ok(mut guard) => {
*guard = 4;
println!("{}", *guard);
}
Err(_) => println!("ожидание вернуло ошибку"),
}
}
Дано число:
let num = 7;
Создайте замок чтения и записи с этим литералом, прочитайте значение в одной ветке и выведите его.
Скажите, сколько писателей одновременно может держать доступ на запись у одного замка чтения и записи.
Дано число:
let num = 1;
Под замком храните литерал, затем через доступ на запись замените его на удвоенное значение и выведите результат.