CodeBlanks Logo Icon CodeBlanks

tokio::sync

tokio::sync ile asenkron senkronizasyon araçlarını öğrenirsin.

tokio::sync

tokio::sync görevler arası eşzamanlama araçları sunar: Mutex, RwLock (kilidi beklerken thread'i bloke etmez), mpsc, broadcast, watch ve tek seferlik yanıt için oneshot:

let (tx, rx) = tokio::sync::oneshot::channel();
tokio::spawn(async move {
    tx.send(6 * 7).unwrap();
});
println!("{}", rx.await.unwrap());   // 42

oneshot, "bir göreve iş ver, sonucunu tek bir mesajla al" deseni için idealdir.

std karşılığı: tek mesajlık kanal

Standart kütüphanede ayrı bir oneshot yoktur, ama tek mesaj gönderilen bir mpsc kanalı aynı işi görür:

use std::sync::mpsc;
use std::thread;

let (tx, rx) = mpsc::channel();
thread::spawn(move || {
    tx.send(6 * 7).unwrap();
});
println!("{}", rx.recv().unwrap());

recv mesaj gelene kadar bekler; gönderici mesaj göndermeden bırakılırsa Err döner.

Uygulama Tek seferlik yanıt

mpsc::channel ile bir kanal aç. Ayrı bir thread 6 * 7 sonucunu göndersin; ana thread recv ile alıp 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 || {
        tx.send(6 * 7).unwrap();
    });
    println!("{}", rx.recv().unwrap());
}

Beklenen çıktı

42

Soru ve cevaplar

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

1 Async kodda <code>std::sync::Mutex</code> ne zaman kabul edilebilir?

  • Hiçbir zaman
  • Her zaman
  • Yalnızca tek thread'de
  • Kilit kısa tutuluyorsa ve .await boyunca elde tutulmuyorsa Doğru cevap

Açıklama: Std mutex'i .await boyunca tutmak hem bloke edebilir hem de Future'ı Send olmaktan çıkarır; bu durumda tokio::sync::Mutex gerekir.

2 Mesaj bekle

Soru
let (tx, rx) = mpsc::channel();
thread::spawn(move || tx.send(42).unwrap());
let n = rx.____().unwrap();
Cevap
let (tx, rx) = mpsc::channel();
thread::spawn(move || tx.send(42).unwrap());
let n = rx.recv().unwrap();

Açıklama: recv bir mesaj gelene kadar bekler.

3 Araç ve kullanım

Kavram Anlamı
oneshot Tek yanıt
mpsc Çok üretici, tek tüketici
broadcast Herkese yayın
watch Son değeri izle

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