Send ve Sync
- Rust kursu
- İleri seviye
- Ders 17/81
- 4 dk
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çilerthread::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 safelyKü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
use std::sync::{Arc, Mutex};
fn main() {
// buraya yaz
}Örnek çözüm
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<T></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ı
fn send_mi<T: ____>() {}
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 |