我正在做一个Rust项目,其中我有两个不同的线程,用于特定的目的。一个是实时线程,其直接与硬件接口并保持严格的定时要求,而另一个是web服务器线程,其提供用于查询所述硬件的当前状态的API。
我需要一种机制,通过这种机制,Web服务器线程可以从实时线程获取硬件的最新状态。这里的挑战是避免使用互斥锁,因为实时线程无法承受被阻塞等待互斥锁的风险。
以下是我考虑过的一些解决方案及其相应的挑战:
rwlock
:但是如果任何读取器有锁,写入器线程(实时线程)将需要等待。
1.双缓冲:执行交换的线程需要一个对整个结构的可变引用,这会导致借用检查器问题。mpsc Channel
:如果没有Web请求,通道可能会很快填满,导致内存浪费。
2条答案
按热度按时间esyap4oy1#
您可以使用
arc-swap
crate,它提供了ArcSwap
类型(以及相关类型):一个Arc
,可以以无锁的方式替换和加载。hujrc8aj2#
我最终使用了大小为1的
ring channel
,它使用了下面crossbeaml
中的AtomicCell<Option<Box<T>>>
。实时线程可以
send()
进入通道,这是原子的和无锁的。然后Web线程可以从通道中读取recv()
,或者如果通道中没有任何内容,则继续使用最后读取的值。