本文簡要介紹rust語言中 Function std::thread::spawn
的用法。
用法
pub fn spawn<F, T>(f: F) -> JoinHandle<T> where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static,
產生一個新線程,為其返回一個 JoinHandle
。
連接句柄提供了一個 join
方法,可用於連接生成的線程。如果生成的線程出現Panics, join
將返回一個 Err
,其中包含提供給 panic!
的參數。
如果刪除連接句柄,則生成的線程將隱式分離。在這種情況下,生成的線程可能不再被連接。 (程序有責任最終加入它創建的線程或分離它們;否則,將導致資源泄漏。)
此調用將使用 Builder
的默認參數創建一個線程,如果要指定堆棧大小或線程名稱,請改用此 API。
正如您在 spawn
的簽名中看到的那樣,給 spawn
的閉包及其返回值都有兩個約束,讓我們解釋一下:
-
'static
約束意味著閉包及其返回值必須具有整個程序執行的生命周期。這樣做的原因是線程可以超過它們被創建的生命周期。事實上,如果線程及其返回值可以比它們的調用者更長壽,我們需要確保它們之後有效,並且因為我們不能知道它何時返回,我們需要讓它們盡可能長時間地有效,即直到程序結束,因此
'static
壽命。 -
Send
約束是因為閉包需要通過按值從它產生的線程到新線程。它的返回值需要從新線程傳遞到它所在的線程join
編輯。提醒一下,Send
標記特征表示從一個線程傳遞到另一個線程是安全的。Sync
表示將引用從一個線程傳遞到另一個線程是安全的。
Panics
如果操作係統無法創建線程,則會出現Panics;使用 Builder::spawn
從此類錯誤中恢複。
例子
創建線程。
use std::thread;
let handler = thread::spawn(|| {
// thread code
});
handler.join().unwrap();
如模塊文檔中所述,線程通常使用 channels
進行通信,這是它通常的外觀。
此示例還展示了如何使用 move
來將值的所有權授予線程。
use std::thread;
use std::sync::mpsc::channel;
let (tx, rx) = channel();
let sender = thread::spawn(move || {
tx.send("Hello, thread".to_owned())
.expect("Unable to send on channel");
});
let receiver = thread::spawn(move || {
let value = rx.recv().expect("Unable to receive from channel");
println!("{}", value);
});
sender.join().expect("The sender thread has panicked");
receiver.join().expect("The receiver thread has panicked");
一個線程也可以通過它的 JoinHandle
返回一個值,你可以使用它來進行異步計算(雖然未來可能更合適)。
use std::thread;
let computation = thread::spawn(|| {
// Some expensive computation.
42
});
let result = computation.join().unwrap();
println!("{}", result);
相關用法
- Rust spin_loop用法及代碼示例
- Rust split_paths用法及代碼示例
- Rust str.make_ascii_uppercase用法及代碼示例
- Rust slice.sort_unstable_by_key用法及代碼示例
- Rust slice.iter_mut用法及代碼示例
- Rust symlink用法及代碼示例
- Rust slice.windows用法及代碼示例
- Rust slice.repeat用法及代碼示例
- Rust slice.group_by_mut用法及代碼示例
- Rust slice.align_to_mut用法及代碼示例
- Rust size_of用法及代碼示例
- Rust slice.as_chunks_unchecked用法及代碼示例
- Rust str.strip_suffix用法及代碼示例
- Rust str.trim_left用法及代碼示例
- Rust slice.fill用法及代碼示例
- Rust slice.array_windows用法及代碼示例
- Rust slice.sort_unstable_by用法及代碼示例
- Rust slice.sort用法及代碼示例
- Rust str.char_indices用法及代碼示例
- Rust str.to_ascii_lowercase用法及代碼示例
- Rust str用法及代碼示例
- Rust slice.rotate_left用法及代碼示例
- Rust slice.as_mut_ptr用法及代碼示例
- Rust str.trim用法及代碼示例
- Rust stringify用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function std::thread::spawn。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。