CodeBlanks Logo Icon CodeBlanks

Send ve Sync

Send ve Sync marker trait'lerini ve önemini öğrenirsin.

Send ve Sync

Rust'ın thread güvenliği iki işaretçi trait'e dayanır; metotları yoktur, derleyici bunları otomatik çıkarır:

  • Send: değerin sahipliği başka bir thread'e taşınabilir.
  • Sync: değere başka thread'lerden &T ile erişilebilir (T: Sync ⇔ &T: Send).
// Send + Sync: i32, String, Vec<T>, Arc<T> (T: Send + Sync), Mutex<T> (T: Send)
// Send ama Sync değil: Cell<T>, RefCell<T>
// ikisi de değil: Rc<T>, ham işaretçiler

thread::spawn'ın imzası F: Send + 'static ister; veri yarışları bu yüzden derleme anında engellenir.

Derleme anı denetimi

Bir türün Send/Sync olup olmadığını boş gövdeli generic fonksiyonlarla derleme anında denetleyebilirsin:

fn send_mi<T: Send>() {}
fn sync_mi<T: Sync>() {}

send_mi::<Arc<Mutex<i32>>>();   // geçer
sync_mi::<Arc<Mutex<i32>>>();   // geçer
// send_mi::<Rc<i32>>();        // hata: `Rc<i32>` cannot be sent between threads safely

Kütüphane yazarları, genel türlerinin thread güvenliğinin yanlışlıkla bozulmadığını bu tür testlerle güvenceye alır.

Uygulama Thread güvenliği denetimi

Yukarıdaki send_mi ve sync_mi fonksiyonlarını yaz. Arc<Mutex<i32>> için ikisini, String için send_mi'yi çağır; derleme geçerse denetim geçti yazdır.

Başlangıç kodu

main.rs
use std::sync::{Arc, Mutex};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::sync::{Arc, Mutex};

fn send_mi<T: Send>() {}
fn sync_mi<T: Sync>() {}

fn main() {
    send_mi::<Arc<Mutex<i32>>>();
    sync_mi::<Arc<Mutex<i32>>>();
    send_mi::<String>();
    println!("denetim geçti");
}

Beklenen çıktı

denetim geçti

Soru ve cevaplar

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

1 Neden <code>Rc&lt;T&gt;</code> Send değildir?

  • Heap kullandığı için
  • Clone olduğu için
  • Send'dir
  • Sayacı atomik değildir; iki thread aynı anda değiştirirse sayı bozulur Doğru cevap

Açıklama: Arc aynı işi atomik sayaçla yapar; biraz daha yavaştır ama Send + Sync'tir.

2 Taşınabilirlik sınırı

Soru
fn send_mi<T: ____>() {}
Cevap
fn send_mi<T: Send>() {}

Açıklama: Send sınırı, türün başka bir thread'e taşınabildiğini denetler.

3 Tür ve özelliği

Kavram Anlamı
Arc<Mutex<i32>> Send + Sync
Rc<i32> Hiçbiri
RefCell<i32> Send, Sync değil
*const i32 Ham işaretçi: hiçbiri

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