英文:
How to transfer latest state between threads in rust without using a mutex
问题
我正在进行一个Rust项目,在这个项目中,我有两个不同的线程,分别用于特定的目的。一个是实时线程,直接与硬件部件进行交互并维护严格的时间要求,而另一个是Web服务器线程,提供API以查询所述硬件的当前状态。
我需要一种机制,使Web服务器线程能够从实时线程获取硬件的最新状态。这里的挑战在于避免使用互斥锁,因为实时线程不能承受等待互斥锁而被阻塞的情况。
以下是我考虑过的一些解决方案及其相应的挑战:
rwlock
:但写入线程(实时线程)需要等待,如果有任何读取器锁定它。- 双缓冲:执行交换的线程需要对整个结构体的可变引用,这会引发借用检查器问题。
mpsc Channel
:如果没有进行Web请求,通道可能会迅速填满,导致内存浪费。
英文:
I am working on a Rust project where I have two distinct threads that serve specific purposes. One is a real-time thread which interfaces directly with a piece of hardware and maintains strict timing requirements, while the other is a web server thread that provides an API for querying the current state of said hardware.
I need a mechanism through which the web server thread can acquire the most recent state of the hardware from the real-time thread. The challenge here is to avoid the use of mutexes, as the real-time thread cannot afford to be blocked waiting for the mutex.
Here are a few solutions I have considered and their corresponding challenges:
rwlock
: But the writer thread (real-time thread) would need to wait if any reader has a lock on it.- Double Buffering: The thread that does the swap needs a mutable reference to the entire struct, which causes borrow checker problems.
mpsc Channel
: If there are no web requests being made, the channel could fill up quickly, leading to wasted memory.
答案1
得分: 2
你可以使用 arc-swap
crate,它提供了 ArcSwap
类型(以及相关类型):这是一个可以在无锁的方式下进行替换和加载的 Arc
。
英文:
You can use the arc-swap
crate, that provides the ArcSwap
type (and related types): an Arc
that can be replaced and loaded in a lock-free fashion.
答案2
得分: 1
我最终使用了大小为1的 ring channel
,它使用了 crossbeaml
下的 AtomicCell<Option<Box<T>>>
。
实时线程可以向通道中的 send()
,这是原子且无锁的。然后,Web 线程可以从通道中的 recv()
,或者如果通道中没有内容,可以继续使用上次读取的值。
英文:
I ended up using a ring channel
with size 1, which uses a AtomicCell<Option<Box<T>>>
from crossbeaml
underneath.
The real-time thread can send()
into the channel, which is atomic and lock-free. Then the web thread can recv()
from the channel, or if there's nothing in the channel, continue using the last read value.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论