我希望在生锈中实现多路复用器/多路解复用器。它应该通过简单地将上游DuplexStream
的{{1}}标识符添加到数据包中,通过一个“下游”DuplexStream
发送几个“上游”port_num
的数据。当然,这也应该反过来:从下游接收的数据包中读取DuplexStream
并将其发送到正确的上游流。
我开始实现这样的MultiplexStream(下面的代码不会编译)。但是,我遇到了一个问题:
将port_num
映射到相应的上游open_ports
的{{1}}变量必须可以访问Rust中不允许的多个任务。
这里可以应用哪种设计模式来解决我的问题?
port_num
答案 0 :(得分:2)
在生锈共享中,数据通过Arc(来自libsync)完成。 Basic Arc用于共享不可变数据,可变的有MutexArc和RWArc。与Arc共享是免费的。
我把一个小例子放在一起:
extern mod sync;
use std::hashmap::HashMap;
fn main() {
let arc = sync::RWArc::new(HashMap::<~str, int>::new());
arc.write(|m| m.insert(~"a", 0));
for num in range(1, 10) {
let arc = arc.clone();
spawn(proc() {
println!("[task {}] Value before is: {}", num, arc.read(|m| m.get(&~"a").clone()));
arc.write(|m| { m.insert_or_update_with(~"a", 0, |_, val| *val += 1); });
println!("[task {}] Value after is: {}", num, arc.read(|m| m.get(&~"a").clone()));
});
}
}
对于最新版本的锈(0.10pre),请使用
extern crate collections;
extern crate sync;
use collections::hashmap::HashMap;
use sync::RWArc;
fn main() {
let arc = RWArc::new(HashMap::<~str, int>::new());
arc.write(|m| m.insert(~"a", 0));
for num in range(1, 10) {
let arc = arc.clone();
spawn(proc() {
println!("[task {}] Value before is: {}", num, arc.read(|m| m.get(&~"a").clone()));
arc.write(|m| { m.insert_or_update_with(~"a", 0, |_, val| *val += 1); });
println!("[task {}] Value after is: {}", num, arc.read(|m| m.get(&~"a").clone()));
});
}
}