本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。