4 releases
0.2.2 | Jan 3, 2023 |
---|---|
0.2.1 | Jan 3, 2023 |
0.2.0 | Jan 3, 2023 |
0.1.0 | Jan 2, 2023 |
#597 in Unix APIs
18KB
182 lines
Process Sync
Adds synchronization primitives that can be shared between multiple processes
Shared memory
let mut shared = SharedMemoryObject::new(123)?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
assert_eq!(*shared.get(), 123);
*shared.get_mut() = 456;
sleep(Duration::from_millis(40));
assert_eq!(*shared.get(), 789);
} else {
sleep(Duration::from_millis(20));
assert_eq!(*shared.get(), 456);
*shared.get_mut() = 789;
}
Mutex
let mut mutex = SharedMutex::new()?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
println!("child lock()");
mutex.lock()?;
println!("child locked");
sleep(Duration::from_millis(40));
println!("child unlock()");
mutex.unlock()?;
} else {
sleep(Duration::from_millis(20));
println!("parent lock()");
mutex.lock()?;
println!("parent locked");
sleep(Duration::from_millis(20));
println!("parent unlock()");
mutex.unlock()?;
}
Condvar
let mut mutex = SharedMutex::new()?;
let mut condvar = SharedCondvar::new()?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
println!("child lock()");
mutex.lock()?;
println!("child wait()");
condvar.wait(&mut mutex)?;
println!("child notified");
mutex.unlock()?;
println!("child unlocked");
} else {
sleep(Duration::from_millis(40));
println!("parent notify()");
condvar.notify_one()?;
}
Dependencies
~44KB