Movatterモバイル変換


[0]ホーム

URL:


RwLock

std::sync

StructRwLock 

1.0.0 ·Source
pub struct RwLock<T: ?Sized> {/* private fields */ }
Expand description

A reader-writer lock

This type of lock allows a number of readers or at most one writer at anypoint in time. The write portion of this lock typically allows modificationof the underlying data (exclusive access) and the read portion of this locktypically allows for read-only access (shared access).

In comparison, aMutex does not distinguish between readers or writersthat acquire the lock, therefore blocking any threads waiting for the lock tobecome available. AnRwLock will allow any number of readers to acquire thelock as long as a writer is not holding the lock.

The priority policy of the lock is dependent on the underlying operatingsystem’s implementation, and this type does not guarantee that anyparticular policy will be used. In particular, a writer which is waiting toacquire the lock inwrite might or might not block concurrent calls toread, e.g.:

Potential deadlock example
// Thread 1              |  // Thread 2let _rg1 = lock.read();  |                         |  // will block                         |  let _wg = lock.write();// may deadlock          |let _rg2 = lock.read();  |

The type parameterT represents the data that this lock protects. It isrequired thatT satisfiesSend to be shared across threads andSync to allow concurrent access through readers. The RAII guardsreturned from the locking methods implementDeref (andDerefMutfor thewrite methods) to allow access to the content of the lock.

§Poisoning

AnRwLock, likeMutex, willusually become poisoned on a panic. Note,however, that anRwLock may only be poisoned if a panic occurs while it islocked exclusively (write mode). If a panic occurs in any reader, then thelock will not be poisoned.

§Examples

usestd::sync::RwLock;letlock = RwLock::new(5);// many reader locks can be held at once{letr1 = lock.read().unwrap();letr2 = lock.read().unwrap();assert_eq!(*r1,5);assert_eq!(*r2,5);}// read locks are dropped at this point// only one write lock may be held, however{letmutw = lock.write().unwrap();*w +=1;assert_eq!(*w,6);}// write lock is dropped here

Implementations§

Source§

impl<T>RwLock<T>

1.0.0 (const: 1.63.0) ·Source

pub const fnnew(t: T) ->RwLock<T>

Creates a new instance of anRwLock<T> which is unlocked.

§Examples
usestd::sync::RwLock;letlock = RwLock::new(5);
Source

pub fnget_cloned(&self) ->Result<T,PoisonError<()>>
where T:Clone,

🔬This is a nightly-only experimental API. (lock_value_accessors #133407)

Returns the contained value by cloning it.

§Errors

This function will return an error if theRwLock is poisoned. AnRwLock is poisoned whenever a writer panics while holding an exclusivelock.

§Examples
#![feature(lock_value_accessors)]usestd::sync::RwLock;letmutlock = RwLock::new(7);assert_eq!(lock.get_cloned().unwrap(),7);
Source

pub fnset(&self, value: T) ->Result<(),PoisonError<T>>

🔬This is a nightly-only experimental API. (lock_value_accessors #133407)

Sets the contained value.

§Errors

This function will return an error containing the providedvalue iftheRwLock is poisoned. AnRwLock is poisoned whenever a writerpanics while holding an exclusive lock.

§Examples
#![feature(lock_value_accessors)]usestd::sync::RwLock;letmutlock = RwLock::new(7);assert_eq!(lock.get_cloned().unwrap(),7);lock.set(11).unwrap();assert_eq!(lock.get_cloned().unwrap(),11);
Source

pub fnreplace(&self, value: T) ->LockResult<T>

🔬This is a nightly-only experimental API. (lock_value_accessors #133407)

Replaces the contained value withvalue, and returns the old contained value.

§Errors

This function will return an error containing the providedvalue iftheRwLock is poisoned. AnRwLock is poisoned whenever a writerpanics while holding an exclusive lock.

§Examples
#![feature(lock_value_accessors)]usestd::sync::RwLock;letmutlock = RwLock::new(7);assert_eq!(lock.replace(11).unwrap(),7);assert_eq!(lock.get_cloned().unwrap(),11);
Source§

impl<T: ?Sized>RwLock<T>

1.0.0 ·Source

pub fnread(&self) ->LockResult<RwLockReadGuard<'_, T>>

Locks thisRwLock with shared read access, blocking the current threaduntil it can be acquired.

The calling thread will be blocked until there are no more writers whichhold the lock. There may be other readers currently inside the lock whenthis method returns. This method does not provide any guarantees withrespect to the ordering of whether contentious readers or writers willacquire the lock first.

Returns an RAII guard which will release this thread’s shared accessonce it is dropped.

§Errors

This function will return an error if theRwLock is poisoned. AnRwLock is poisoned whenever a writer panics while holding an exclusivelock. The failure will occur immediately after the lock has beenacquired. The acquired lock guard will be contained in the returnederror.

§Panics

This function might panic when called if the lock is already held by the current thread.

§Examples
usestd::sync::{Arc, RwLock};usestd::thread;letlock = Arc::new(RwLock::new(1));letc_lock = Arc::clone(&lock);letn = lock.read().unwrap();assert_eq!(*n,1);thread::spawn(move|| {letr = c_lock.read();assert!(r.is_ok());}).join().unwrap();
1.0.0 ·Source

pub fntry_read(&self) ->TryLockResult<RwLockReadGuard<'_, T>>

Attempts to acquire thisRwLock with shared read access.

If the access could not be granted at this time, thenErr is returned.Otherwise, an RAII guard is returned which will release the shared accesswhen it is dropped.

This function does not block.

This function does not provide any guarantees with respect to the orderingof whether contentious readers or writers will acquire the lock first.

§Errors

This function will return thePoisoned error if theRwLock ispoisoned. AnRwLock is poisoned whenever a writer panics while holdingan exclusive lock.Poisoned will only be returned if the lock wouldhave otherwise been acquired. An acquired lock guard will be containedin the returned error.

This function will return theWouldBlock error if theRwLock couldnot be acquired because it was already locked exclusively.

§Examples
usestd::sync::RwLock;letlock = RwLock::new(1);matchlock.try_read() {Ok(n) =>assert_eq!(*n,1),Err(_) =>unreachable!(),};
1.0.0 ·Source

pub fnwrite(&self) ->LockResult<RwLockWriteGuard<'_, T>>

Locks thisRwLock with exclusive write access, blocking the currentthread until it can be acquired.

This function will not return while other writers or other readerscurrently have access to the lock.

Returns an RAII guard which will drop the write access of thisRwLockwhen dropped.

§Errors

This function will return an error if theRwLock is poisoned. AnRwLock is poisoned whenever a writer panics while holding an exclusivelock. An error will be returned when the lock is acquired. The acquiredlock guard will be contained in the returned error.

§Panics

This function might panic when called if the lock is already held by the current thread.

§Examples
usestd::sync::RwLock;letlock = RwLock::new(1);letmutn = lock.write().unwrap();*n =2;assert!(lock.try_read().is_err());
1.0.0 ·Source

pub fntry_write(&self) ->TryLockResult<RwLockWriteGuard<'_, T>>

Attempts to lock thisRwLock with exclusive write access.

If the lock could not be acquired at this time, thenErr is returned.Otherwise, an RAII guard is returned which will release the lock whenit is dropped.

This function does not block.

This function does not provide any guarantees with respect to the orderingof whether contentious readers or writers will acquire the lock first.

§Errors

This function will return thePoisoned error if theRwLock ispoisoned. AnRwLock is poisoned whenever a writer panics while holdingan exclusive lock.Poisoned will only be returned if the lock wouldhave otherwise been acquired. An acquired lock guard will be containedin the returned error.

This function will return theWouldBlock error if theRwLock couldnot be acquired because it was already locked.

§Examples
usestd::sync::RwLock;letlock = RwLock::new(1);letn = lock.read().unwrap();assert_eq!(*n,1);assert!(lock.try_write().is_err());
1.2.0 ·Source

pub fnis_poisoned(&self) ->bool

Determines whether the lock is poisoned.

If another thread is active, the lock can still become poisoned at anytime. You should not trust afalse value for program correctnesswithout additional synchronization.

§Examples
usestd::sync::{Arc, RwLock};usestd::thread;letlock = Arc::new(RwLock::new(0));letc_lock = Arc::clone(&lock);let _= thread::spawn(move|| {let_lock = c_lock.write().unwrap();panic!();// the lock gets poisoned}).join();assert_eq!(lock.is_poisoned(),true);
1.77.0 ·Source

pub fnclear_poison(&self)

Clear the poisoned state from a lock.

If the lock is poisoned, it will remain poisoned until this function is called. This allowsrecovering from a poisoned state and marking that it has recovered. For example, if thevalue is overwritten by a known-good value, then the lock can be marked as un-poisoned. Orpossibly, the value could be inspected to determine if it is in a consistent state, and ifso the poison is removed.

§Examples
usestd::sync::{Arc, RwLock};usestd::thread;letlock = Arc::new(RwLock::new(0));letc_lock = Arc::clone(&lock);let _= thread::spawn(move|| {let_lock = c_lock.write().unwrap();panic!();// the lock gets poisoned}).join();assert_eq!(lock.is_poisoned(),true);letguard = lock.write().unwrap_or_else(|mute| {**e.get_mut() =1;    lock.clear_poison();    e.into_inner()});assert_eq!(lock.is_poisoned(),false);assert_eq!(*guard,1);
1.6.0 ·Source

pub fninto_inner(self) ->LockResult<T>
where T:Sized,

Consumes thisRwLock, returning the underlying data.

§Errors

This function will return an error containing the underlying data iftheRwLock is poisoned. AnRwLock is poisoned whenever a writerpanics while holding an exclusive lock. An error will only be returnedif the lock would have otherwise been acquired.

§Examples
usestd::sync::RwLock;letlock = RwLock::new(String::new());{letmuts = lock.write().unwrap();*s ="modified".to_owned();}assert_eq!(lock.into_inner().unwrap(),"modified");
1.6.0 ·Source

pub fnget_mut(&mut self) ->LockResult<&mut T>

Returns a mutable reference to the underlying data.

Since this call borrows theRwLock mutably, no actual locking needs totake place – the mutable borrow statically guarantees no new locks can be acquiredwhile this reference exists. Note that this method does not clear any previously abandonedlocks (e.g., viaforget() on aRwLockReadGuard orRwLockWriteGuard).

§Errors

This function will return an error containing a mutable reference tothe underlying data if theRwLock is poisoned. AnRwLock ispoisoned whenever a writer panics while holding an exclusive lock.An error will only be returned if the lock would have otherwise beenacquired.

§Examples
usestd::sync::RwLock;letmutlock = RwLock::new(0);*lock.get_mut().unwrap() =10;assert_eq!(*lock.read().unwrap(),10);
Source

pub const fndata_ptr(&self) ->*mut T

🔬This is a nightly-only experimental API. (rwlock_data_ptr #140368)

Returns a raw pointer to the underlying data.

The returned pointer is always non-null and properly aligned, but it isthe user’s responsibility to ensure that any reads and writes through itare properly synchronized to avoid data races, and that it is not reador written through after the lock is dropped.

Trait Implementations§

1.0.0 ·Source§

impl<T: ?Sized +Debug>Debug forRwLock<T>

Source§

fnfmt(&self, f: &mutFormatter<'_>) ->Result

Formats the value using the given formatter.Read more
1.10.0 ·Source§

impl<T:Default>Default forRwLock<T>

Source§

fndefault() ->RwLock<T>

Creates a newRwLock<T>, with theDefault value for T.

1.24.0 ·Source§

impl<T>From<T> forRwLock<T>

Source§

fnfrom(t: T) -> Self

Creates a new instance of anRwLock<T> which is unlocked.This is equivalent toRwLock::new.

1.12.0 ·Source§

impl<T: ?Sized>RefUnwindSafe forRwLock<T>

1.0.0 ·Source§

impl<T: ?Sized +Send>Send forRwLock<T>

1.0.0 ·Source§

impl<T: ?Sized +Send +Sync>Sync forRwLock<T>

1.9.0 ·Source§

impl<T: ?Sized>UnwindSafe forRwLock<T>

Auto Trait Implementations§

§

impl<T> !Freeze forRwLock<T>

§

impl<T>Unpin forRwLock<T>
where T:Unpin + ?Sized,

Blanket Implementations§

Source§

impl<T>Any for T
where T: 'static + ?Sized,

Source§

fntype_id(&self) ->TypeId

Gets theTypeId ofself.Read more
Source§

impl<T>Borrow<T> for T
where T: ?Sized,

Source§

fnborrow(&self) ->&T

Immutably borrows from an owned value.Read more
Source§

impl<T>BorrowMut<T> for T
where T: ?Sized,

Source§

fnborrow_mut(&mut self) ->&mut T

Mutably borrows from an owned value.Read more
Source§

impl<T>From<!> for T

Source§

fnfrom(t:!) -> T

Converts to this type from the input type.
Source§

impl<T>From<T> for T

Source§

fnfrom(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U>Into<U> for T
where U:From<T>,

Source§

fninto(self) -> U

CallsU::from(self).

That is, this conversion is whatever the implementation ofFrom<T> for U chooses to do.

Source§

impl<T, U>TryFrom<U> for T
where U:Into<T>,

Source§

typeError =Infallible

The type returned in the event of a conversion error.
Source§

fntry_from(value: U) ->Result<T, <T asTryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U>TryInto<U> for T
where U:TryFrom<T>,

Source§

typeError = <U asTryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fntry_into(self) ->Result<U, <U asTryFrom<T>>::Error>

Performs the conversion.

[8]ページ先頭

©2009-2026 Movatter.jp