• 通道

    通道

    Rust 针对线程之间的通信提供了异步的通道(channel)。通道允许两个端点之间信息的单向流动:Sender(发送端) 和 Receiver(接收端)。

    1. use std::sync::mpsc::{Sender, Receiver};
    2. use std::sync::mpsc;
    3. use std::thread;
    4. static NTHREADS: i32 = 3;
    5. fn main() {
    6. // 通道有两个端点:`Sender<T>` 和 `Receiver<T>`,其中 `T` 是要发送
    7. // 消息的类型(类型标注是可有可无的)
    8. let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel();
    9. for id in 0..NTHREADS {
    10. // sender 发送端可被复制
    11. let thread_tx = tx.clone();
    12. // 每个线程都将通过通道来发送它的 id
    13. thread::spawn(move || {
    14. // 此线程取得 `thread_tx` 所有权
    15. // 每个线程都在通道中排队列出消息
    16. // (原文:The thread takes ownership over `thread_tx`
    17. // Each thread queues a message in the channel)
    18. thread_tx.send(id).unwrap();
    19. // 发送是一个非阻塞操作,线程将在发送完消息后继续进行
    20. println!("thread {} finished", id);
    21. });
    22. }
    23. // 所有消息都在此处被收集
    24. let mut ids = Vec::with_capacity(NTHREADS as usize);
    25. for _ in 0..NTHREADS {
    26. // `recv` 方法从通道中拿到一个消息
    27. // 若无可用消息的话,`recv` 将阻止当前线程
    28. ids.push(rx.recv());
    29. }
    30. // 显示已发送消息的次序
    31. println!("{:?}", ids);
    32. }