CodeBlanks Logo Icon CodeBlanks

Özet - Kanallar

mpsc ve thread'i birleştirerek iş parçacıklı bir iş kuyruğu yazarsın.

Kanallar özeti

mpsc::channel sınırsız, sync_channel(n) sınırlı kanal açar. send sahipliği aktarır; alıcı yoksa Err. recv bekler, try_recv beklemez, recv_timeout süreyle bekler; tüm göndericiler kapanınca alıcı biter. tx.clone() ile çok üretici olur. Async kodda tokio::sync::mpsc kullanılır. Kanallar, ortak durum yerine aşamalar arası veri akışı kurmanın temiz yoludur.

İşlem hattı

Her aşama bir thread'dir; aşamalar kanallarla bağlanır. Bir aşama bittiğinde göndericisi bırakılır ve kapanma zincir halinde sonraki aşamalara yayılır:

let (tx1, rx1) = mpsc::channel();
let (tx2, rx2) = mpsc::channel();
thread::spawn(move || for i in 1..=5 { tx1.send(i).unwrap(); });
thread::spawn(move || for n in rx1 { tx2.send(n * n).unwrap(); });
let sonuc: Vec<i32> = rx2.iter().collect();

Uygulama İki aşamalı hat

Yukarıdaki hattı kur: ilk thread 1'den 5'e kadar sayıları göndersin, ikinci thread her sayının karesini sonraki kanala aktarsın. Ana thread sonuçları toplayıp {:?} ile yazdırsın.

Başlangıç kodu

main.rs
use std::sync::mpsc;
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx1, rx1) = mpsc::channel();
    let (tx2, rx2) = mpsc::channel();
    thread::spawn(move || {
        for i in 1..=5 {
            tx1.send(i).unwrap();
        }
    });
    thread::spawn(move || {
        for n in rx1 {
            tx2.send(n * n).unwrap();
        }
    });
    let sonuc: Vec<i32> = rx2.iter().collect();
    println!("{:?}", sonuc);
}

Beklenen çıktı

[1, 4, 9, 16, 25]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İki aşamalı bir hatta (üret → kare al → topla) sıra neden korunur?

  • Korunmaz
  • Mutex sayesinde
  • Her aşamada tek bir thread var ve kanallar FIFO'dur Doğru cevap
  • Rust otomatik sıralar

Açıklama: Bir aşamaya birden çok işçi eklenirse sıra garantisi kaybolur.

2 Aşamayı bağla

Soru
thread::spawn(move || for n in ____ {
    tx2.send(n * n).unwrap();
});
Cevap
thread::spawn(move || for n in rx1 {
    tx2.send(n * n).unwrap();
});

Açıklama: İkinci aşama birinci aşamanın alıcısını dinler.

3 Grubun özeti

Kavram Anlamı
channel() Sınırsız kanal
sync_channel(n) Sınırlı kanal
tx.clone() Çok üretici
try_recv Beklemeden

İleri seviye bölümündeki tüm dersler