2017-01-11 163 views
3

示例代碼:當你產生一個循環時會發生什麼?

fn main() { 
    use std::thread::spawn; 
    spawn(|| { loop { println!("a") } }); 
    // `a` is never printed 
} 
fn main() { 
    use std::thread::spawn; 
    spawn(|| { loop { println!("a") } }); 
    loop { } 
    // `a` is printed repeatedly 
} 

a打印到在第二種情況下的標準輸出,但相同的是不是在第一種情況下如此。這是爲什麼?在第一種情況下也不應該反覆打印a

+1

注意:您忽略的返回值'的螺紋:: spawn',如果你使用它,你可以查詢線程是否已完成,或等待其完成(這可能需要一段時間的無限循環)。 –

回答

5

不應該在第一種情況下反覆打印a

號從文檔從thread:spawn,重點煤礦:

的加入手柄在被丟棄將隱式分離的子線程。在這種情況下,子線程可以活得比父(除非父線程是主線程;當主線程完成的整個過程被終止。)此外,加入手柄提供了一種連接方法,可用於加入子線程。如果子線程發生混亂,join將返回一個包含給panic的參數的Err。

整個程序退出,因爲主線程已退出。甚至沒有機會啓動子線程,更不用說打印任何東西。

在第二個例子中,可以防止主線程從同時造成,要永遠自旋退出。

當你spawn一個循環會發生什麼?

只要程序執行,該線程將循環旋轉,


慣用,你不需要在spawn額外的花括號,這是更標準只導入std::thread,然後調用thread::spawn

fn main() { 
    use std::thread; 
    thread::spawn(|| loop {println!("a") }); 
} 
+0

在發佈此問題之前,我以粗體讀取了該部分,但對我而言並不那麼清楚。我現在很清楚。謝謝。 – goo

相關問題