Create mutex-locking-and-unlocking.md

initial version of "Create mutex-locking-and-unlocking.md"
pull/409/head
python-ast-person 2 years ago committed by GitHub
parent b5f7500fc4
commit 9329345289
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,37 @@
# Locking and Unlocking
Locking and unlocking is simple with our layout; Make sure the mutex is in the correct state, then toggle it.
use core::sync::fence;
impl<T> Mutex<T>{
pub fn lock(&self)->MutexGuard<T>{
while self.is_locked.compare_exchange(
false,//expecting it to not be locked
true ,//lock it if it is not already locked
Ordering::Acquire,//If we succeed, use acquire ordering to prevent
Ordering::Release//If we faill to acquire the lock, it does not matter which ordering we choose, so choose the fastest.
).is_err(){}//If we fail to aquire the lock immediately try again.
fence(Ordering::Acquire);//prevent writes to the data protected by the mutex from being reordered before the mutex is actually acquired.
//safety:The previous steps we took means that no one else has the lock
unsafe{return &mut self.value.get()}
}
///Safety:Make sure the caller has acquired the lock, and will not dereference the return mutable reference again.
pub unsafe fn unlock(&self){
if self.is_locked.compare_exchange(
true,//The caller should ensure the mutex is locked
false,//Mark the lock as unlocked
Ordering::Release,
Ordering::Relaxed,//We are about to panic anyway, the ordering doesn't matter
).is_err{
panic!("Unlock called while the lock was not locked")
};
}
}
> Written with [StackEdit](https://stackedit.io/).
Loading…
Cancel
Save