Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ограниченные каналы

С ограниченными (синхронными) каналами send() может блокировать текущий поток:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::sync::mpsc;
use std::thread;
use std::time::Duration;

fn main() {
    let (tx, rx) = mpsc::sync_channel(3);

    thread::spawn(move || {
        let thread_id = thread::current().id();
        for i in 0..10 {
            tx.send(format!("Message {i}")).unwrap();
            println!("{thread_id:?}: sent Message {i}");
        }
        println!("{thread_id:?}: done");
    });
    thread::sleep(Duration::from_millis(100));

    for msg in rx {
        println!("Main: got {msg}");
    }
}
This slide should take about 8 minutes.
  • Вызов send() блокирует текущий поток, пока в канале не появится место для нового сообщения. Поток может заблокироваться бесконечно, если никто не читает из канала.
  • Как и у неограниченных каналов, вызов send() завершится с ошибкой, если канал закрыт.
  • Ограниченный канал размером ноль называется «rendezvous channel» (канал рандеву). Каждая отправка блокирует текущий поток, пока другой поток не вызовет recv().