#队列 #mpmc-队列 #通道 #mpmc

双锁队列

基于 Michael-Scott 双锁队列算法的 MPMC 通道

2 个版本

使用旧的 Rust 2015

0.1.1 2017年10月4日
0.1.0 2017年1月4日

#11#mpmc-队列

Download history 59/week @ 2023-12-18 14/week @ 2023-12-25 12/week @ 2024-01-01 38/week @ 2024-01-08 22/week @ 2024-01-15 27/week @ 2024-01-22 241/week @ 2024-01-29 119/week @ 2024-02-05 23/week @ 2024-02-12 104/week @ 2024-02-19 211/week @ 2024-02-26 95/week @ 2024-03-04 304/week @ 2024-03-11 65/week @ 2024-03-18 36/week @ 2024-03-25 81/week @ 2024-04-01

498 每月下载量
3 个crate中使用 (2 个直接使用)

MIT/Apache

30KB
538 行(不含注释)

双锁队列

基于 Michael-Scott "双锁队列" 算法的 MPMC 队列。

Build Status Crates.io

文档

许可

two-lock-queue 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,部分内容受各种类似 BSD 许可证的覆盖。

请参阅 LICENSE-APACHE 和 LICENSE-MIT 以获取详细信息。


lib.rs:

多生产者、多消费者 FIFO 队列通信原语。

此crate提供了一个多生产者、多消费者、基于消息的通信通道,具体定义在两种类型之间

  • 发送者
  • 接收者

使用 SenderReceiver 发送数据。发送者和接收者都是可克隆的,这样就可以在多个线程之间并发地进行发送和接收。

断开连接

发送和接收操作都将返回一个 Result,表示操作是否成功。不成功的操作通常表示通道的另一部分在相应的线程中“挂起”,并被丢弃。

一旦通道的一半被释放,大多数操作都无法继续进行,因此将返回 Err

示例

简单使用

use std::thread;

let (tx, rx) = two_lock_queue::channel(1024);

for i in 0..10 {
    let tx = tx.clone();
    thread::spawn(move || {
        tx.send(i).unwrap();
    });
}

let mut threads = vec![];

for _ in 0..10 {
    let rx = rx.clone();
    threads.push(thread::spawn(move || {
        let j = rx.recv().unwrap();
        assert!(0 <= j && j < 10);
    }));
}

for th in threads {
    th.join().unwrap();
}

算法

该算法是 Java 的 LinkedBlockingQueue 中找到的 Michael-Scott 双锁队列的一个变体。队列使用互斥锁来保护头指针和尾指针。大多数时间,发送和接收操作只需要锁定一个互斥锁。使用 AtomicUsize 来跟踪队列中的元素数量以及处理生产者和消费者两部分之间的协调。

无运行时依赖