通道

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. thread_tx.send(id).unwrap();
  17. // 发送是一个非阻塞(non-blocking)操作,线程将在发送完消息后
  18. // 会立即继续进行
  19. println!("thread {} finished", id);
  20. });
  21. }
  22. // 所有消息都在此处被收集
  23. let mut ids = Vec::with_capacity(NTHREADS as usize);
  24. for _ in 0..NTHREADS {
  25. // `recv` 方法从通道中拿到一个消息
  26. // 若无可用消息的话,`recv` 将阻止当前线程
  27. ids.push(rx.recv());
  28. }
  29. // 显示消息被发送的次序
  30. println!("{:?}", ids);
  31. }