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版本)。如果您真的想知道是否在生产中使用它,我建议您使用它,因为它使用无锁原语,所以在加载时速度更快,并且已经接受了严格的检查和测试。