Concurrency 这是一个幼稚的阻塞队列吗?

Concurrency 这是一个幼稚的阻塞队列吗?,concurrency,rust,blockingqueue,Concurrency,Rust,Blockingqueue,以下是阻塞队列的正确实现吗 更正如下: 线程安全,即在多线程场景中具有队列的语义 如果为空,则在尝试检索元素时阻塞 如果已满(std::u8::MAX,在本例中为),则在尝试添加新元素时会阻塞 从我的静态分析,我会说它是安全的死锁;但我知道同步有多棘手 这个实现是否有任何明显的错误,会阻止我在生产中使用?(假设情景) 如果此实现是正确的,与适当的阻塞队列相比,性能有哪些缺点,为什么 代码 使用std::collections::VecDeque; 使用板条箱::信号灯; 使用std::sync:

以下是阻塞队列的正确实现吗

更正如下:

  • 线程安全,即在多线程场景中具有队列的语义
  • 如果为空,则在尝试检索元素时阻塞
  • 如果已满(
    std::u8::MAX,在本例中为
    ),则在尝试添加新元素时会阻塞
  • 从我的静态分析,我会说它是安全的死锁;但我知道同步有多棘手

    这个实现是否有任何明显的错误,会阻止我在生产中使用?(假设情景)
    如果此实现是正确的,与适当的
    阻塞队列
    相比,性能有哪些缺点,为什么

    代码

    使用std::collections::VecDeque;
    使用板条箱::信号灯;
    使用std::sync::Mutex;
    发布结构阻塞队列{
    非空队列:信号量,
    有界_队列:信号量,
    数据:互斥
    }
    impl阻塞队列{
    pub fn poll(&self)->T{
    self.non_empty_queue.decrement();
    让mut lock_guard=self.data.lock().expect(“无法获取锁…”);
    let result=lock_guard.pop_back().expect(“主要缺陷”);
    self.bounded_queue.increment();
    结果
    }
    pub-fn offer(&self,t:t)->(){
    自有界_队列递减();
    让mut lock_guard=self.data.lock().expect(“无法获取锁…”);
    锁紧护罩。向前推(t);
    self.non_empty_queue.increment();
    }
    pub fn new()->BlockingQueue{
    阻塞队列{
    非空队列:信号量::新(0),
    有界_队列:信号量::新(std::u8::MAX),
    数据:Mutex::new(VecDeque::new())
    }
    }
    }
    
    注:

  • 信号灯是我自己创造的。让我们假设它是正确实现的
  • bounded_queue
    尝试阻止超出
    std::u8::MAX
    范围的插入
  • 非空队列
    尝试在空队列时防止“弹出”

  • 这个问题可能更适合合作伙伴网站,尽管我不知道Rust社区有多活跃。关于实际问题,请注意:并行队列的最佳实现在很大程度上取决于它所解决的问题。典型的方法要么是批量操作,要么是锁自由(lock freedom),用原子实现(例如,见crossbeams版本)。如果您真的想知道是否在生产中使用它,我建议您使用它,因为它使用无锁原语,所以在加载时速度更快,并且已经接受了严格的检查和测试。