5个版本
0.2.3 | 2024年3月5日 |
---|---|
0.2.2 | 2023年12月2日 |
0.1.1 | 2023年12月1日 |
#607 在 异步
18KB
144 行
简化rendezvous通道
在Rust中,mpsc::channel可以通过利用我们可以阻塞在接收者的recv()
函数上直到所有发送者都释放的事实,用作线程间的同步原语。
这个crate旨在给出一个具有表达力的名字,并减少一些竞态条件,即原始发送者在调用recv()
之前没有被释放的情况。
由于释放语义,这个crate的版本只支持同步代码。
cargo add rendezvous
示例使用
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
use rendezvous::{Rendezvous, RendezvousGuard};
/// A slow worker function. Sleeps, then mutates a value.
fn slow_worker_fn(_guard: RendezvousGuard, mut value: Arc<Mutex<u32>>) {
thread::sleep(Duration::from_millis(400));
let mut value = value.lock().unwrap();
*value = 42;
}
fn example() {
// The guard that ensures synchronization across threads.
// Rendezvous itself acts as a guard: If not explicitly dropped, it will block the current
// scope until all rendezvous points are reached.
let rendezvous = Rendezvous::new();
// A value to mutate in a different thread.
let value = Arc::new(Mutex::new(0u32));
// Run the worker in a thread.
thread::spawn({
let guard = rendezvous.fork_guard();
let value = value.clone();
move || slow_worker_fn(guard, value)
});
// Block until the thread has finished its work.
rendezvous.rendezvous();
// The thread finished in time.
assert_eq!(*(value.lock().unwrap()), 42);
}
依赖项
~0–6MB
~22K SLoC