有界通道

With bounded (synchronous) channels, send can block the current thread:

  1. use std::sync::mpsc;
  2. use std::thread;
  3. use std::time::Duration;
  4. fn main() {
  5. let (tx, rx) = mpsc::sync_channel(3);
  6. thread::spawn(move || {
  7. let thread_id = thread::current().id();
  8. for i in 1..10 {
  9. tx.send(format!("Message {i}")).unwrap();
  10. println!("{thread_id:?}: sent Message {i}");
  11. }
  12. println!("{thread_id:?}: done");
  13. });
  14. thread::sleep(Duration::from_millis(100));
  15. for msg in rx.iter() {
  16. println!("Main: got {msg}");
  17. }
  18. }
  • 调用 send 将阻塞当前线程,直到通道中有足够的空间放置新消息。如果无人从通道读取数据,线程会被无限期地阻塞。
  • 如果通道关闭,调用 send 将中止并返回错误(这就是它会返回 Result 的原因)。当接收器被丢弃时,通道将关闭。
  • A bounded channel with a size of zero is called a “rendezvous channel”. Every send will block the current thread until another thread calls recv.