#队列 #同步 #线程 #节点 #消费者 #等待 #互斥锁

sigq

信号队列,当节点可用时通知等待的消费者

11 个不稳定版本 (4 个重大更改)

0.13.4 2023年9月15日
0.13.3 2023年7月27日
0.12.0 2023年7月24日
0.11.0 2022年9月9日
0.9.0 2020年9月24日

#347并发

每月 23 次下载
用于 4 个 Crates(直接使用 2 个)

0BSD 许可证

13KB
209

信号队列

信号队列是一个互斥锁保护的队列,当新节点被推入队列时可以通知等待的任务/线程。


lib.rs:

sigq 是一个支持从线程/任务中推入和弹出节点的 FIFO 队列,可以跨越同步/异步边界。与队列交互的接口是一对端点。使用 Pusher 向队列添加数据,使用 Puller 从队列中拉取数据。

Pusher 有一个 push() 方法,用于将新节点推入队列。

Puller 有一个阻塞的 pop() 和一个返回 Futureapop(),用于从队列中获取下一个节点。如果可用,它们将立即返回下一个节点,否则将阻塞并等待将新节点推入队列。可以使用 try_pop() 以非阻塞方式获取下一个节点,如果可用。

let (pusher, puller) = sigq::new();
pusher.push(42).unwrap();
assert_eq!(puller.pop(), Ok(42));
assert_eq!(puller.try_pop(), Ok(None));

语义

  • 丢弃最后一个 Pusher 端点将导致等待的 Puller 唤醒并返回 Err(StaleErr),如果队列中没有更多节点。
  • 丢弃最后一个 Puller 端点将
    • 立即丢弃队列中的所有节点。
    • 如果尝试向队列中添加新节点,将使 Puller 返回 Err(StaleErr)

依赖关系

~1.1–6.5MB
~25K SLoC