thread::spawn
- Rust kursu
- İleri seviye
- Ders 13/81
- 4 dk
std::thread::spawn ile iş parçacığı oluşturmayı öğrenirsin.
thread::spawn
thread::spawn yeni bir işletim sistemi thread'i başlatır ve bir JoinHandle döndürür. Thread'in closure'ı 'static olmalıdır, yani dış değişkenleri ödünç alamaz; move ile sahiplenir. Ödünç almak gerekiyorsa kapsamlı thread'ler (thread::scope) kullanılır:
let v = vec![1, 2, 3, 4];
let (a, b) = v.split_at(2);
let toplam = thread::scope(|s| {
let h1 = s.spawn(|| a.iter().sum::<i32>());
let h2 = s.spawn(|| b.iter().sum::<i32>());
h1.join().unwrap() + h2.join().unwrap()
}); // tüm thread'ler burada biterscope, içindeki tüm thread'lerin kapsam bitmeden tamamlanmasını garanti ettiği için yerel verinin ödünç alınmasına izin verir.
join ve panic
join, thread bitene kadar bekler ve sonucunu Result içinde verir. Thread panic verirse Err döner; panic ana thread'e yayılmaz:
let h = thread::spawn(|| {
panic!("hata");
});
println!("{}", h.join().is_err()); // truejoin edilmeyen thread'ler, ana thread bitince program ile birlikte sonlandırılır.
Uygulama İki yarım
vec![1, 2, 3, 4] vektörünü split_at(2) ile ikiye böl. thread::scope içinde her yarıyı ayrı bir thread'de topla, sonuçları birleştir ve yazdır.
Başlangıç kodu
use std::thread;
fn main() {
// buraya yaz
}Örnek çözüm
use std::thread;
fn main() {
let v = vec![1, 2, 3, 4];
let (a, b) = v.split_at(2);
let toplam = thread::scope(|s| {
let h1 = s.spawn(|| a.iter().sum::<i32>());
let h2 = s.spawn(|| b.iter().sum::<i32>());
h1.join().unwrap() + h2.join().unwrap()
});
println!("{}", toplam);
}Beklenen çıktı
10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>thread::spawn(|| println!("{:?}", v))</code> neden derlenmez? (<code>v</code> yerel bir Vec)
- println! thread'de çalışmaz
- Vec paylaşılamaz
- Derlenir
- Thread v'den uzun yaşayabilir; move ya da thread::scope gerekir Doğru cevap
Açıklama: E0373: closure may outlive the current function. Derleyici move eklemeyi önerir.
2 Kapsamlı thread
let toplam = thread::____(|s| {
let h = s.spawn(|| a.iter().sum::<i32>());
h.join().unwrap()
});
let toplam = thread::scope(|s| {
let h = s.spawn(|| a.iter().sum::<i32>());
h.join().unwrap()
});
Açıklama: thread::scope yerel verinin ödünç alınmasına izin verir.
3 Araç ve özelliği
| Kavram | Anlamı |
|---|---|
thread::spawn |
'static closure ister |
thread::scope |
Ödünç almaya izin verir |
h.join() |
Bitişi bekler |
join() → Err |
Thread panic verdi |