Метод try_read
Метод try_read класса RwLock пытается
получить блокировку для чтения, не блокируя текущий поток.
Он возвращает значение типа TryLockResult, которое
может быть либо Ok с RwLockReadGuard, либо
Err с причиной неудачи. Параметров метод не принимает.
В отличие от метода read, который приостанавливает
поток до освобождения блокировки, try_read сразу
возвращает управление, если блокировка занята. Это удобно,
когда нужно избежать взаимной блокировки или реализовать
неблокирующую логику.
Синтаксис
rwlock.try_read()
Пример
Давайте создадим RwLock и попробуем получить
блокировку чтения, когда она свободна:
use std::sync::RwLock;
fn main()
{
let rwlock = RwLock::new(5);
match rwlock.try_read()
{
Ok(guard) =>
{
println!("Read lock acquired: {}", *guard);
}
Err(e) =>
{
println!("Failed to acquire read lock: {:?}", e);
}
}
}
Результат выполнения кода:
Read lock acquired: 5
Пример
Давайте попробуем получить блокировку чтения, когда уже удерживается блокировка записи:
use std::sync::RwLock;
fn main()
{
let rwlock = RwLock::new(5);
let _write_guard = rwlock.write().unwrap();
match rwlock.try_read()
{
Ok(guard) =>
{
println!("Read lock acquired: {}", *guard);
}
Err(e) =>
{
println!("Failed to acquire read lock: {:?}", e);
}
}
}
Результат выполнения кода:
Failed to acquire read lock: WouldBlock
Пример
Давайте попробуем получить блокировку чтения, когда уже удерживаются другие блокировки чтения. Это допустимо:
use std::sync::RwLock;
fn main()
{
let rwlock = RwLock::new(5);
let _read_guard1 = rwlock.read().unwrap();
match rwlock.try_read()
{
Ok(guard) =>
{
println!("Read lock acquired: {}", *guard);
}
Err(e) =>
{
println!("Failed to acquire read lock: {:?}", e);
}
}
}
Результат выполнения кода:
Read lock acquired: 5