#channel

update_channel

单值更新通道

4 个版本

0.1.3 2021年1月29日
0.1.2 2021年1月29日
0.1.1 2021年1月15日
0.1.0 2021年1月15日

#880 in 并发

MIT 许可协议

19KB
362

单值更新通道。Updater 可以更新共享值,然后 Receiver 可以使用 receive_update 方法更新其内部值。

示例

    use update_channel::channel_with;
    use std::thread::spawn;

    let (mut receiver, updater) = channel_with(0);
    assert_eq!(*receiver.borrow(), 0);

    spawn(move || {
        updater.update(2).unwrap(); // shared value is 2
        updater.update(12).unwrap(); // shared value is 12
    })
    .join().unwrap();

    // Shared value is 2 but internal value is 0
    assert_eq!(*receiver.borrow(), 0);
    // Update the latest value
    receiver.recv_update().unwrap();
    // Shared value is 12 and internal value 12
    assert_eq!(*receiver.borrow(), 12);

update_channel 在 MIT 许可协议下分发。

查看 LICENSE 获取更多信息


lib.rs:

单值多生产者多消费者更新通道。接收者和通道都可以通过 update_channel 和 update_channel_with 函数创建。

通道大多是无锁的,多个读取者可以同时访问共享值。唯一可能阻塞的方式是通过调用 borrow_locked 方法并持有 RwLockReadGuard,或者同时发生大量写入。

更新通道实际上可以看作是一个可以由 Updater 更新的单值,然后接收者可以通过克隆其内部缓冲区中的新值来使用 receive_update 方法更新其内部值。如果只使用单个接收者,则 take_update 方法是 receive_update 方法的更有效替代。

示例

use update_channel::channel_with;
use std::thread::spawn;

let (mut receiver, updater) = channel_with(0);
assert_eq!(*receiver.borrow(), 0);

spawn(move || {
    updater.update(2).unwrap(); // shared value is 2
    updater.update(12).unwrap(); // shared value is 12
})
.join().unwrap();

// Shared value is 2 but internal value is 0
assert_eq!(*receiver.borrow(), 0);
// Update the latest value
receiver.recv_update().unwrap();
// Shared value is 12 and internal value 12
assert_eq!(*receiver.borrow(), 12);

无运行时依赖