接收者在尝试通过频道

时间:2017-10-28 23:21:56

标签: multithreading rust channel

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

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)与父线程通信,而父线程使用{{1}与子线程交谈。

我正在调用端点上对ws.thread_endpoint的所有调用的解包,所以如果它无法发送,它就会崩溃。果然,我收到的运行时错误如下:

send

关于这方面的文档非常少,但我能想到的是,只有在频道关闭时才会发生这种情况。

1 个答案:

答案 0 :(得分:1)

事实证明,问题在于我忘记将消息接收代码放在子线程中的无限循环中,所以一旦收到第一条消息,它就会退出并关闭相应的通道。 / p>