Expand description
Read Only Lock.
This is a wrapper around Arc<RwLock<T>>
that only implements RwLock::read()
operations.
Usage: Create a normal Arc<RwLock<T>>
in thread_1
, send a RoLock
to thread_2
:
let rw = Arc::new(RwLock::new(0)); // Regular Arc<RwLock<T>>.
let ro = RoLock::new(&rw); // Read Only Lock.
assert!(*rw.read().unwrap() == 0); // This can read...
*rw.write().unwrap() = 1; // and write.
std::thread::spawn(move|| {
assert!(*ro.read().unwrap() == 1); // This one can only read.
});
thread_1
still has full read/write controlthread_2
can onlyRoLock::read()
This type guarantees at compile time that you cannot write because the function doesn’t even exist:
ⓘ
let rw = Arc::new(RwLock::new(0));
let ro = RoLock::new(&rw);
ro.write();
Since the inner field of RoLock
(self.0
) is private, you can’t call RwLock::write
directly either:
ⓘ
let rw = Arc::new(RwLock::new(0));
let ro = RoLock::new(&rw);
ro.0.write();
Calling .clone()
on RoLock
is (relatively) cheap, as it just clones the inner Arc
.
let (rw, ro) = RoLock::new_pair(0);
// This is (relatively) cheap.
let clone = ro.clone();
Structs
- Read Only Lock.
Enums
- The error returned when
RoLock::into_inner
fails.