Структура RwLockWriteGuard
RAII-структура, используемая для освобождения эксклюзивного доступа на запись блокировки при её удалении.
Описание
Эта структура создаётся методами write и try_write на RwLock.
Методы
downgrade (стабильно с версии 1.92.0)
#![allow(unused)] fn main() { pub fn downgrade(s: Self) -> RwLockReadGuard<'rwlock, T> }
Понижает RwLockWriteGuard с записью до RwLockReadGuard с чтением.
Поскольку у нас есть RwLockWriteGuard, RwLock уже должен быть заблокирован для записи, поэтому этот метод не может завершиться неудачей.
После понижения другим читателям будет разрешено читать защищённые данные.
Примеры:
downgrade принимает владение RwLockWriteGuard и возвращает RwLockReadGuard.
#![allow(unused)] fn main() { use std::sync::{RwLock, RwLockWriteGuard}; let rw = RwLock::new(0); let mut write_guard = rw.write().unwrap(); *write_guard = 42; let read_guard = RwLockWriteGuard::downgrade(write_guard); assert_eq!(42, *read_guard); }
downgrade атомарно изменит состояние RwLock из эксклюзивного режима в общий режим. Это означает, что другому потоку записи невозможно встать между вызовом потока downgrade и любыми операциями чтения, которые он выполняет после понижения.
#![allow(unused)] fn main() { use std::sync::{Arc, RwLock, RwLockWriteGuard}; let rw = Arc::new(RwLock::new(1)); // Переводим блокировку в режим записи. let mut main_write_guard = rw.write().unwrap(); let rw_clone = rw.clone(); let evil_handle = std::thread::spawn(move || { // Это не вернётся, пока основной поток не отпустит `main_read_guard`. let mut evil_guard = rw_clone.write().unwrap(); assert_eq!(*evil_guard, 2); *evil_guard = 3; }); *main_write_guard = 2; // Атомарно понижаем guard записи до guard чтения. let main_read_guard = RwLockWriteGuard::downgrade(main_write_guard); // Поскольку `downgrade` атомарна, поток-писатель не мог изменить защищённые данные. assert_eq!(*main_read_guard, 2, "`downgrade` was not atomic"); }
map (только ночная версия, экспериментальное API)
#![allow(unused)] fn main() { pub fn map<U, F>(orig: Self, f: F) -> MappedRwLockWriteGuard<'rwlock, U> where F: FnOnce(&mut T) -> &mut U, U: ?Sized, }
Создаёт MappedRwLockWriteGuard для компонента заимствованных данных, например, варианта перечисления.
RwLock уже заблокирован для записи, поэтому это не может завершиться неудачей.
Это ассоциированная функция, которую нужно использовать как RwLockWriteGuard::map(...). Метод будет конфликтовать с методами с тем же именем у содержимого RwLockWriteGuard, используемого через Deref.
Паника: Если замыкание запаникует, guard будет удалён (разблокирован) и RwLock будет отравлен.
filter_map (только ночная версия, экспериментальное API)
#![allow(unused)] fn main() { pub fn filter_map<U, F>( orig: Self, f: F, ) -> Result<MappedRwLockWriteGuard<'rwlock, U>, Self> where F: FnOnce(&mut T) -> Option<&mut U>, U: ?Sized, }
Создаёт MappedRwLockWriteGuard для компонента заимствованных данных. Исходный guard возвращается как Err(...), если замыкание возвращает None.
RwLock уже заблокирован для записи, поэтому это не может завершиться неудачей.
Это ассоциированная функция, которую нужно использовать как RwLockWriteGuard::filter_map(...). Метод будет конфликтовать с методами с тем же именем у содержимого RwLockWriteGuard, используемого через Deref.
Паника: Если замыкание запаникует, guard будет удалён (разблокирован) и RwLock будет отравлен.
Реализации трейтов
Debug (стабильно с версии 1.16.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized + Debug.
Deref (стабильно с версии 1.0.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized.
- Ассоциированный тип:
Target = T - Метод:
deref(&self) -> &T
DerefMut (стабильно с версии 1.0.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized.
- Метод:
deref_mut(&mut self) -> &mut T
Display (стабильно с версии 1.20.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized + Display.
Drop (стабильно с версии 1.0.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized.
!Send
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized.
Sync (стабильно с версии 1.23.0)
Реализован для RwLockWriteGuard<'_, T>, где T: ?Sized + Sync.
Автоматические реализации трейтов
FreezeдляRwLockWriteGuard<'rwlock, T>, гдеT: ?SizedRefUnwindSafeдляRwLockWriteGuard<'rwlock, T>, гдеT: ?SizedUnpinдляRwLockWriteGuard<'rwlock, T>, гдеT: ?SizedUnwindSafeдляRwLockWriteGuard<'rwlock, T>, гдеT: ?Sized
Blanket-реализации
Стандартные blanket-реализации для всех типов, такие как Any, Borrow<T>, From<T>, ToString и другие.