gpt4 book ai didi

multithreading - 如何跨线程共享包含发送方和接收方字段的结构?

转载 作者:行者123 更新时间:2023-12-03 11:40:17 24 4
gpt4 key购买 nike

我有一个大致如下的结构

struct Node {
id: Arc<i32>,
data: Arc<Mutex<i32>>, // Actually not i32, but that is not important for this question.
rx: Receiver<()>,
tx: Sender<()>
}

我使用 Receiver中的 Sendermpsc::channel

我想在多个线程之间共享。我有一个“用户”线程,其中 Node的用户在 Node上执行一些功能。这将导致一些UDP消息发送到其他计算机,并且该线程将在 rx.recv()上阻止。在后台,我有一个或多个线程在UDP套接字上执行阻止接收调用。当他们接收到一条消息时,便会更新 data结构的 Node字段,并且当后台线程注意到已接收到足够多的消息时,它将使用 ()发送 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的所有字段(例如 iddata)。这就是为什么我要在它们之间共享一个 Node实例的原因。但是 ReceiverSender都不是 Sync,因此上述内容无法编译。我知道我可以克隆 Sender在每个后台线程中放入一个其中的一个。

我看到的一种解决方案是在 rx中不包括 txNode。但是然后我将丢失封装,因为那时 Node实例的创建者将不得不创建 channel 并生成后台线程。如果可能,我希望将其全部封装在 Node中。

上面的代码片段是我可以手动克隆 Sender的地方。我不需要克隆 Receiver,因为我只有一个线程可以使用它。

最佳答案

当我在这里回答时:https://stackoverflow.com/a/65354846/6070255

You may use std::sync::mpsc::SyncSender from the standard library. The difference is that it implements the Sync trait but it will may block if there is no space in the internal buffer while sending a message.

For more information:

关于multithreading - 如何跨线程共享包含发送方和接收方字段的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56936956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com