如何跨线程共享包含 Sender 和 Receiver 字段的结构?

2023-12-01

我有一个结构,大致如下所示

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领域的Nodestruct,当后台线程注意到已收到足够多的消息时,它将发送() 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因为我只会有一个线程使用它。


正如我在这里回答的:https://stackoverflow.com/a/65354846/6070255

您可以使用std::sync::mpsc::SyncSender来自标准库。不同之处在于它实现了Sync但如果发送消息时内部缓冲区没有空间,它可能会阻塞。

了解更多信息:

  • std::sync::mpsc::通道
  • std::sync::mpsc::sync_channel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跨线程共享包含 Sender 和 Receiver 字段的结构? 的相关文章

  • 核心蓝牙框架本质上是异步的吗?

    当我在应用程序中使用 CB 框架时 我没有引入任何并发性或反应性方法 并且一切正常 当我每秒从外设接收超过 100 个样本时 UI 不会被阻止 这是否意味着它被设计为异步工作 我没有找到任何说明它具有异步性质的资源 也没有找到任何在使用核心
  • 使用强制转换的可变访问器安全吗?

    我试图理解重复代码的问题 and mut在 getter 类型的函数中 我试图了解这个问题的特定解决方案是否使用内部的强制转换unsafe块将是安全的 以下是该问题的示例 它取自非常好的教程 使用太多的链表学习 Rust https rus
  • 特征对象和特征的直接实现者的特征实现

    我有一个主要封装向量的结构 struct Group
  • 解析 nom 中一定大小的数字

    我可以很好地解析这样的数字 map res digit1 s str s parse
  • Objective C 中最好的多线程方法?

    我正在开发一个 iPad 应用程序 目前正在努力寻找多线程的最佳方法 让我用一个简化的例子来说明这一点 我有一个包含 2 个子视图的视图 一个目录选择器和一个包含所选目录中所有图像缩略图的图库 由于 下载 和生成这些缩略图可能需要相当长的时
  • 是否有在相似结构之间移动字段的语法?

    我有一个大结构Foo
  • IO 异常 - 读结束死 - 在此示例中导致它的原因以及如何修复它 - Java 中的多线程应用程序

    这是一扩大 https stackoverflow com questions 22180458 how to set boolean flag of thread 1 from thread 2 in java multithreadin
  • 包装类型时“在当前范围内找不到类型 T 的方法”

    我正在尝试围绕两种不同类型制作适配器来完成相同的工作 但我无法重写这两种类型 X有一个消耗的方法self因此运行时多态包装器不适用 唯一的选择是静态通用方法 struct X impl X fn f self n i32 println n
  • 将异步函数包装在结构中时的生命周期

    我正在尝试将异步函数包装在结构中 例如 use std future Future struct X struct Y async fn f x X gt Y Y struct MyStruct
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • 多线程调试技术

    我想知道是否有人知道多线程应用程序调试技术的一个很好的调查 理想情况下 我正在寻找基于案例的分析 死锁 饥饿 损坏的共享状态 Net 特定的或通用的 我不知道有哪篇文章或书籍可以满足您的需求 因此这是我从 12 年 Windows 多线程调
  • 完成任务时手动捕获并应用 SynchronizationContext

    我遇到了挂起等待的问题 已描述here https stackoverflow com questions 40992035 awaiting a task that is being completed on a background t
  • 从 Android 函数更新 Textview

    有人可以告诉我如何从函数更新 Android Textview 控件吗 我在互联网上进行了深入搜索 看到很多人都问同样的问题 我测试了线程但无法工作 有人有一个简单的工作示例吗 例如 调用一个函数 在循环中运行多次 并且该函数在 TextV
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 为什么这个 Rust 程序忽略不变性

    我有以下 Rust 程序 我希望它会导致编译错误 因为x稍后会重新分配 但它遵守并给出输出 为什么 fn main let x y 1 3 println X is and Y is x y let x i32 565 println No
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 异步任务中止时会发生什么?

    锈有async可以绑定到的方法Abortable https docs rs futures preview 0 3 0 alpha 19 futures future struct Abortable html期货 文档说 当中止时 未来
  • 在模式匹配期间防止移动语义

    我这里有一个愚蠢的例子 只是为了演示我在另一个库和模式匹配中遇到的问题 struct Person name String age i32 choice Choices derive Debug enum Choices Good Neut

随机推荐