如何在不使用互斥的情况下在rust中的线程之间传输最新状态

2guxujil  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(86)

我正在做一个Rust项目,其中我有两个不同的线程,用于特定的目的。一个是实时线程,其直接与硬件接口并保持严格的定时要求,而另一个是web服务器线程,其提供用于查询所述硬件的当前状态的API。
我需要一种机制,通过这种机制,Web服务器线程可以从实时线程获取硬件的最新状态。这里的挑战是避免使用互斥锁,因为实时线程无法承受被阻塞等待互斥锁的风险。
以下是我考虑过的一些解决方案及其相应的挑战:

  1. rwlock:但是如果任何读取器有锁,写入器线程(实时线程)将需要等待。
    1.双缓冲:执行交换的线程需要一个对整个结构的可变引用,这会导致借用检查器问题。
  2. mpsc Channel:如果没有Web请求,通道可能会很快填满,导致内存浪费。
esyap4oy

esyap4oy1#

您可以使用arc-swap crate,它提供了ArcSwap类型(以及相关类型):一个Arc,可以以无锁的方式替换和加载。

hujrc8aj

hujrc8aj2#

我最终使用了大小为1的ring channel,它使用了下面crossbeaml中的AtomicCell<Option<Box<T>>>
实时线程可以send()进入通道,这是原子的和无锁的。然后Web线程可以从通道中读取recv(),或者如果通道中没有任何内容,则继续使用最后读取的值。

相关问题