我正在尝试在两个线程之间建立双向通信:子线程既可以向父节点发送也可以从父节点接收,父节点可以向子节点发送和接收。由于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
关于这方面的文档非常少,但我能想到的是,只有在频道关闭时才会发生这种情况。
答案 0 :(得分:1)
事实证明,问题在于我忘记将消息接收代码放在子线程中的无限循环中,所以一旦收到第一条消息,它就会退出并关闭相应的通道。 / p>