CodeBlanks Logo Icon CodeBlanks

mpsc kanalı

std::sync::mpsc ile kanal oluşturmayı öğrenirsin.

mpsc kanalı

Kanallar, thread'lerin veriyi paylaşmak yerine mesajla iletişim kurmasını sağlar: "Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş." mpsc (multiple producer, single consumer) bir gönderici (tx) ve bir alıcı (rx) verir:

use std::sync::mpsc;

let (tx, rx) = mpsc::channel();
thread::spawn(move || {
    for i in 1..=3 {
        tx.send(format!("mesaj {i}")).unwrap();
    }
});
for m in rx {                // tx bırakılınca döngü biter
    println!("{m}");
}

Gönderilen değerin sahipliği alıcıya geçer; gönderen artık ona erişemez.

Kanal bir yineleyicidir

for m in rx (ya da rx.iter()) her mesajda recv çağırır ve tüm göndericiler bırakıldığında biter. Gönderici thread'in closure'ı bitince tx otomatik bırakılır; bu yüzden döngü kendiliğinden sona erer.

// mesaj sırası, tek bir gönderici için korunur
// mesaj 1
// mesaj 2
// mesaj 3

Uygulama Mesajlar

Bir kanal aç. Ayrı bir thread mesaj 1, mesaj 2, mesaj 3 metinlerini göndersin; ana thread for m in rx ile her birini 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 (tx, rx) = mpsc::channel();
    thread::spawn(move || {
        for i in 1..=3 {
            tx.send(format!("mesaj {i}")).unwrap();
        }
    });
    for m in rx {
        println!("{}", m);
    }
}

Beklenen çıktı

mesaj 1
mesaj 2
mesaj 3

Soru ve cevaplar

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

1 Gönderdikten sonra değeri kullanmaya çalışmak (<code>tx.send(s); println!("{s}")</code>) ne olur?

  • Çalışır
  • Panic
  • Boş metin yazar
  • E0382: s kanala taşındı Doğru cevap

Açıklama: Sahiplik aktarımı, iki thread'in aynı veriyi aynı anda değiştirmesini imkânsız kılar.

2 Kanal aç

Soru
let (tx, rx) = mpsc::____();
Cevap
let (tx, rx) = mpsc::channel();

Açıklama: mpsc::channel bir (gönderici, alıcı) ikilisi döndürür.

3 Parça ve görevi

Kavram Anlamı
tx Gönderici
rx Alıcı
tx.send(v) Sahipliği aktarır
for m in rx Göndericiler kapanana kadar

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