Rust 并发
在并发编程中,程序的不同部分会独立地执行。另一方面,在并行编程中,程序的不同部分同时执行。随着越来越多的计算机利用它们的多个处理器,这两种模型同样重要。
线程
我们可以使用线程同时运行代码。在当前操作系统中,执行程序的代码在一个进程中运行,操作系统同时管理多个进程。在您的程序中,您也可以有同时运行的独立部分。运行这些独立部分的功能称为线程。
创建线程
使用 thread::spawn 函数来创建一个新的线程。spawn函数将闭包作为参数。闭包定义了应该由线程执行的代码。以下示例从一个主线程打印一些文本,然后从一个新线程打印其他文本。
//import the necessary modules
use std::thread;
use std::time::Duration;
fn main() {
//create a new thread
thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
//code executed by the main thread
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
}
输出
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the spawned thread!
hi number 4 from the main thread!
主线程打印了1到4的值。
注意: 当主线程结束时,新线程将停止。这个程序的输出可能每次都有些不同。
thread::sleep 函数强制线程停止执行一段时间,让另一个线程运行。线程可能会轮流运行,但这不是100%保证的,这取决于操作系统如何调度线程。在此次运行中,主线程首先被打印,尽管从生成的线程中的打印语句在代码中出现得更早。此外,即使生成的线程被编程为打印值直到9,但在主线程关闭之前,它只能做到5。
连接句柄
生成的线程可能没有机会运行或完全运行。这是因为主线程执行得很快。函数spawn<F, T>(f: F) -> JoinHandlelt;T>返回一个JoinHandle。JoinHandle的join()方法等待关联的线程完成。
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
handle.join().unwrap();
}
输出
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the spawned thread!
hi number 3 from the main thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!
主线程和派生线程继续切换。
注意 - 主线程等待派生线程完成,因为调用了 join() 方法。