You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust标准库中是否存在单写多读的通道实现?

单写多读的同步通道实现

Rust标准库中没有提供和std::sync::mpsc::sync_channel功能对应但单写入者、多读取者的现成通道实现。标准库mpsc模块的通道要么是多写单读模式,要么无法满足你的角色限制需求。

你可以基于标准库的同步原语手动实现,核心思路如下:

  • 用Mutex保护一个消息队列(比如VecDeque),配合Condvar实现读取者的阻塞等待,当写入者发送消息时通知所有等待的读取者。
  • 通过结构体设计限制写入者只能有一个(不实现Clone trait),读取者则允许无限克隆(实现Clone trait)。

以下是一个基础实现示例:

use std::sync::{Arc, Mutex, Condvar};
use std::collections::VecDeque;

struct ChannelInner<T> {
    queue: Mutex<VecDeque<T>>,
    condvar: Condvar,
}

pub struct SingleWriterMultiReaderChannel<T>;

impl<T> SingleWriterMultiReaderChannel<T> {
    pub fn new() -> (Writer<T>, Reader<T>) {
        let inner = Arc::new(ChannelInner {
            queue: Mutex::new(VecDeque::new()),
            condvar: Condvar::new(),
        });
        (
            Writer { inner: inner.clone() },
            Reader { inner }
        )
    }
}

pub struct Writer<T> {
    inner: Arc<ChannelInner<T>>,
}

impl<T> Writer<T> {
    pub fn send(&self, value: T) {
        let mut queue = self.inner.queue.lock().unwrap();
        queue.push_back(value);
        // 通知所有等待的读取者有新消息
        self.inner.condvar.notify_all();
    }
}

pub struct Reader<T> {
    inner: Arc<ChannelInner<T>>,
}

impl<T> Clone for Reader<T> {
    fn clone(&self) -> Self {
        Reader { inner: self.inner.clone() }
    }
}

impl<T> Reader<T> {
    pub fn recv(&self) -> T {
        let mut queue = self.inner.queue.lock().unwrap();
        // 队列空时阻塞等待
        while queue.is_empty() {
            queue = self.inner.condvar.wait(queue).unwrap();
        }
        queue.pop_front().unwrap()
    }
}

注意:这个实现中每个消息只会被一个读取者消费。如果需要广播消息(所有读取者都能收到每一条消息),你需要调整设计,比如为每个读取者维护独立的消息队列,写入时将消息复制到所有队列中。

内容的提问来源于stack exchange,提问作者dath.vg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:05:15