在Rust中实现MultiplexStream

时间:2014-02-20 16:27:22

标签: concurrency rust multiplexing

我希望在生锈中实现多路复用器/多路解复用器。它应该通过简单地将上游DuplexStream的{​​{1}}标识符添加到数据包中,通过一个“下游”DuplexStream发送几个“上游”port_num的数据。当然,这也应该反过来:从下游接收的数据包中读取DuplexStream并将其发送到正确的上游流。

我开始实现这样的MultiplexStream(下面的代码不会编译)。但是,我遇到了一个问题: 将port_num映射到相应的上游open_ports的{​​{1}}变量必须可以访问Rust中不允许的多个任务。

这里可以应用哪种设计模式来解决我的问题?

port_num

1 个答案:

答案 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()));
        });
    }
}