Rust
thread::spawn
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 biter
scope, 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()); // true
join 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.
Örnek çözümü göster
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);
}
Kendini test et
-
<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
Cevabı göster
Thread v'den uzun yaşayabilir; move ya da thread::scope gerekir — E0373: closure may outlive the current function. Derleyici move eklemeyi önerir.
-
Kapsamlı thread
let toplam = thread::____(|s| {
let h = s.spawn(|| a.iter().sum::<i32>());
h.join().unwrap()
});
Cevabı göster
let toplam = thread::scope(|s| {
let h = s.spawn(|| a.iter().sum::<i32>());
h.join().unwrap()
});
-
Araç ve özelliği
- thread::spawn
- 'static closure ister
- thread::scope
- Ödünç almaya izin verir
- h.join()
- Bitişi bekler
- join() → Err
- Thread panic verdi
Sıradaki ders: Mutex<T>