5个版本

0.2.3 2024年3月5日
0.2.2 2023年12月2日
0.1.1 2023年12月1日

#607异步

EUPL-1.2

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