我想在 rust 中实现一个多路复用器/解复用器。它应该DuplexStream
通过一个单一的“下游”发送多个“上游”的数据,DuplexStream
只需port_num
将上游的标识符添加DuplexStream
到数据包中即可。当然,这也应该反过来工作:port_num
从从下游接收的数据包中读取数据并将其发送到正确的上游流。
我开始实现这样的MultiplexStream(下面的代码不会编译)。但是,我面临一个问题:映射到相应上游的open_ports
变量必须可以被多个任务访问,这在 Rust 中是不允许的。port_num
DuplexStream
在这里可以应用什么设计模式来解决我的问题?
impl MultiplexStream<T,U> {
fn new(downstream: DuplexStream<(u32,T), U>) -> MultiplexStream<T,U> {
let mut open_ports = HashMap::<u32, DuplexStream<(u32,T), U>>new();
spawn do {
let res = try {
loop {
let (port_num, data) = downstream.recv();
match open_ports.find(port_num) {
Some(intermediate) => {
let res = try {
intermediate.send(data)
}
if res.is_err() {
open_ports.remove(port_num);
}
}
None => {}
}
}
}
// downstream was closed => cleanup
for intermediate in open_ports.values() {
intermediate.close();
}
open_ports.clear();
}
}
fn open<V: Send>(port_num: u32) -> Result(DuplexStream<V,T>, ()) {
if open_ports.contains_key(port_num) {
return Err(());
}
let (upstream, intermediate) = DuplexStream<V,T>::new();
open_ports.insert(port_num, intermediate);
spawn do {
let res = try {
loop {
let data = intermediate.recv();
downstream.send(~(port_num, data));
}
}
// upstream was closed => cleanup
intermediate.close();
open_ports.remove(port_num);
}
return Ok(upstream);
}
}