我有一个结构,大致如下所示
struct Node {
id: Arc<i32>,
data: Arc<Mutex<i32>>, // Actually not i32, but that is not important for this question.
rx: Receiver<()>,
tx: Sender<()>
}
I use Receiver
and Sender
from mpsc::channel
.
我想在多个线程中共享这个。我有一个“用户”线程,其中的用户Node
执行一些函数Node
。这将导致一些 UDP 消息被发送到其他计算机,并且该线程将阻塞rx.recv()
。在后台我有一个or more在 UDP 套接字上执行阻塞接收调用的线程。当他们收到消息时,他们会更新data
领域的Node
struct,当后台线程注意到已收到足够多的消息时,它将发送()
using tx.send()
,让用户线程继续执行。
分享一个Node
实例到另一个线程,我做这样的事情:
let node: Arc<Node> = ...
let node_for_background_thread = Arc::clone(&node);
let background_thread_handle = thread::spawn(move || {
node_for_background_thread.start_receive_loop();
});
我需要访问所有字段Node
(e.g. id
and data
)在用户线程和后台线程中。这就是为什么我想分享一个实例Node
穿过他们。但两者都没有Receiver
nor Sender
is Sync
,所以上面的代码无法编译。我知道我可以克隆Sender
将其中一个拥有的放入每个后台线程中。
我看到的一种解决方案是不包括rx
and tx
in Node
。但从那时起我就会失去封装性Node
实例必须创建通道并生成后台线程。我想把它全部封装在Node
如果可能的话。
上面的代码片段是我可以手动克隆的地方Sender
。我不需要克隆Receiver
因为我只会有一个线程使用它。