CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.rs
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let toplam = thread::____(|s| {
    let h = s.spawn(|| a.iter().sum::<i32>());
    h.join().unwrap()
});
Cevap
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

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