pub struct RwLock<T> { /* private fields */ }
Expand description
Wrapper for parking_lot::RwLock<T>
.
Implementations§
source§impl<T> RwLock<T>
impl<T> RwLock<T>
sourcepub fn new(value: T) -> Self
pub fn new(value: T) -> Self
Create a new RwLock<T>
.
Examples found in repository?
examples/race.rs (line 7)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() -> Result<(), Box<dyn std::error::Error>> {
let lock = Arc::new(RwLock::new(0u64));
let mut threads = Vec::new();
unlock::capture();
for _ in 0..100 {
let lock = lock.clone();
threads.push(thread::spawn(move || {
let mut sum = 0u64;
for n in 0..100 {
if n % 4 == 0 {
*lock.write() += 1;
} else {
sum += *lock.read();
}
std::thread::sleep(std::time::Duration::from_millis(n % 11));
}
sum
}));
}
let mut total = 0;
for thread in threads {
total += thread.join().unwrap();
}
dbg!(total);
let events = unlock::drain();
dbg!(events.len());
unlock::html::write("trace.html", &events)?;
Ok(())
}
sourcepub fn read(&self) -> RwLockReadGuard<'_, T>
pub fn read(&self) -> RwLockReadGuard<'_, T>
Lock the RwLock<T>
for reading.
Examples found in repository?
examples/race.rs (line 23)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() -> Result<(), Box<dyn std::error::Error>> {
let lock = Arc::new(RwLock::new(0u64));
let mut threads = Vec::new();
unlock::capture();
for _ in 0..100 {
let lock = lock.clone();
threads.push(thread::spawn(move || {
let mut sum = 0u64;
for n in 0..100 {
if n % 4 == 0 {
*lock.write() += 1;
} else {
sum += *lock.read();
}
std::thread::sleep(std::time::Duration::from_millis(n % 11));
}
sum
}));
}
let mut total = 0;
for thread in threads {
total += thread.join().unwrap();
}
dbg!(total);
let events = unlock::drain();
dbg!(events.len());
unlock::html::write("trace.html", &events)?;
Ok(())
}
sourcepub fn write(&self) -> RwLockWriteGuard<'_, T>
pub fn write(&self) -> RwLockWriteGuard<'_, T>
Lock the RwLock<T>
for writing.
Examples found in repository?
examples/race.rs (line 21)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() -> Result<(), Box<dyn std::error::Error>> {
let lock = Arc::new(RwLock::new(0u64));
let mut threads = Vec::new();
unlock::capture();
for _ in 0..100 {
let lock = lock.clone();
threads.push(thread::spawn(move || {
let mut sum = 0u64;
for n in 0..100 {
if n % 4 == 0 {
*lock.write() += 1;
} else {
sum += *lock.read();
}
std::thread::sleep(std::time::Duration::from_millis(n % 11));
}
sum
}));
}
let mut total = 0;
for thread in threads {
total += thread.join().unwrap();
}
dbg!(total);
let events = unlock::drain();
dbg!(events.len());
unlock::html::write("trace.html", &events)?;
Ok(())
}
Trait Implementations§
Auto Trait Implementations§
impl<T> !RefUnwindSafe for RwLock<T>
impl<T> Send for RwLock<T>where
T: Send,
impl<T> Sync for RwLock<T>
impl<T> Unpin for RwLock<T>where
T: Unpin,
impl<T> UnwindSafe for RwLock<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more