4个版本

0.2.2 2023年1月3日
0.2.1 2023年1月3日
0.2.0 2023年1月3日
0.1.0 2023年1月2日

#548 in Unix API

MIT/Apache

18KB
182 代码行数,不包括注释

Process Sync

Crates.io Documentation

添加可在多个进程间共享的同步原语

共享内存

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;
}

互斥锁

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()?;
}

条件变量

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()?;
}

依赖项

~43KB