收件人关闭并返回一个SendError尝试通过通道发送
问题描述:
我试图设置两个线程之间的双向通信:子线程既可以发送到父进程,也可以从父进程接收,父进程可以发送去和从孩子接收。由于这样的事实,在锈通道是单向的,我使用的是一组双通道的,像这样的组织(从我家酿线程库代码段):收件人关闭并返回一个SendError尝试通过通道发送
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
的电话打包,所以如果它发送失败,它会崩溃。果然,我得到一个运行时错误,看起来像这样:
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.
的文档上,这是非常微薄的,但我能图什么小了是,如果通道被关闭,这只是发生。
答
事实证明,问题在于我忘记将消息接收代码放入子线程中,因此一旦它收到第一条消息,就会退出并关闭对应的通道。