multithreading - 接收器在尝试通过 channel 发送时关闭并返回 SendError

标签 multithreading rust channel

我正在尝试在两个线程之间建立双向通信:子线程既可以向父线程发送数据也可以从父线程接收数据,而父线程既可以向子线程发送数据也可以从子线程接收数据。由于 Rust 中的 channel 是单向的,我使用了一组两个 channel ,组织如下(来 self 自制的线程库的片段):

let (tx, rx) = channel();
let (tx2, rx2) = channel();

(Endpoint {
     sender: tx2,
     receiver: rx,
 },
 Endpoint {
     sender: tx,
     receiver: rx2,
 })

我的设置函数中的代码如下所示:

let BiChannel {
    e1: world,
    e2: thread,
} = BiChannel::new();

let ws = WorldState {
    ...
    thread_endpoint: thread,
};
std::thread::spawn(threading::handle_life(world));

在此代码段中,threading::handle_life 函数返回一个移动闭包,该闭包使用传递的端点(上面代码中的 world)与父线程通信,而父线程使用 ws.thread_endpoint 与子线程对话。

我在端点上对所有 send 的调用调用 unwrap,所以如果发送失败,它就会崩溃。果然,我收到了如下所示的运行时错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "SendError(..)"', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.

这方面的文档非常少,但我能弄清楚的一点是,只有当 channel 关闭时才会发生这种情况。

最佳答案

原来问题出在我忘记把接收消息的代码放在子线程中死循环了,所以它一收到第一条消息就退出了,相应的 channel 也关闭了。

关于multithreading - 接收器在尝试通过 channel 发送时关闭并返回 SendError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995458/

相关文章:

python - Django/Python 使用进度条下载文件

rust - 为什么在基于类型实现宏时需要在 <$a> 中使用尖括号?

rust - 为什么 Vec<T>::split_at_mut 为范围的其余部分借用向量?

Go,将数据传递到 channel

multithreading - 在 IntelliJ 上调试或运行时线程数不同

c# - STA 线程异常传播

c - 在 C 中使用线程的异步文件 I/O

rust - 如何将大于u8的数字写到指针?

go - 停止循环的代码不起作用

android - channel 或 mutablesharedflow ,哪个是已弃用的 localbroadcastmanager 的更好替代品