#linux #thread

futex-queue

基于 Linux futex 的具有定时器功能的高效 MPSC 队列。适用于实时应用。

2 个版本

0.1.1 2021 年 9 月 29 日
0.1.0 2021 年 9 月 29 日

#1124 in 并发


用于 linux-rtic

Apache-2.0 OR MIT

12KB
180

futex-queue

License Cargo Documentation

基于 Linux futex 的具有定时器功能的高效 MPSC 队列。适用于实时应用。

工作原理

队列基于 Linux futex 系统调用来在单个系统调用中等待立即和计划中的项。这减轻了对单独定时器线程的需求,这将涉及多次上下文切换。

立即项通过常规 futex 原子变量唤醒机制发送。计划中的项使用 FUTEX_WAIT_BITSET 操作,以队列中最早项的绝对时间戳作为系统调用的超时。

示例

let (tx, mut rx) = FutexQueue::<u32, 4>::new();
let now = Instant::now();

let thread = thread::spawn(move || {
    loop {
        let item = rx.recv();
        println!("{} ms: Received: {}", now.elapsed().as_millis(), item.value());
    }
});

tx.send(1).unwrap();
tx.send_scheduled(2, now + Duration::from_secs(1)).unwrap();
tx.send(3).unwrap();
tx.send_scheduled(4, now + Duration::from_secs(2)).unwrap();

thread.join().unwrap();

输出

0 ms: Received: 3
0 ms: Received: 1
1000 ms: Received: 2
2000 ms: Received: 4

依赖项

~715KB
~14K SLoC