Process Sync Crates.io Documentation

Adds synchronization primitives that can be shared between multiple processes

Shared memory

```rust let mut shared = SharedMemoryObject::new(123)?;

let pid = unsafe { fork() }; assert!(pid >= 0);

if pid == 0 { asserteq!(*shared.get(), 123); *shared.getmut() = 456; sleep(Duration::frommillis(40)); asserteq!(shared.get(), 789); } else { sleep(Duration::from_millis(20)); assert_eq!(shared.get(), 456); *shared.get_mut() = 789; } ```

Mutex

```rust 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::frommillis(40)); println!("child unlock()"); mutex.unlock()?; } else { sleep(Duration::frommillis(20)); println!("parent lock()"); mutex.lock()?; println!("parent locked"); sleep(Duration::from_millis(20)); println!("parent unlock()"); mutex.unlock()?; } ```

Condvar

```rust 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::frommillis(40)); println!("parent notify()"); condvar.notifyone()?; } ```