Rust线程
提示
- 创建和运行线程:Rust 使用
thread::spawn()
函数创建新线程,允许在程序中同时运行多个任务,但增加了复杂性。 - 使用 Join 句柄控制线程:
thread::spawn()
返回一个JoinHandle
,使用join()
方法可以确保创建的线程完成任务后主线程才继续执行 。 - 线程间的数据传递:使用
move
关键字可以将数据移动到线程中,确保数据安全。Rust 通过通道(mpsc::channel()
)支持线程间的消息传递,实现线程间的通信。
线程是进程的最小可执行单元。
线程允许我们将程序中的计算分割成多个线程。同时运行多个任务可以提高代码性能。然而,这也可能增加复杂性。
在 Rust 中创建新线程
在 Rust 中,我们可以使用 std
模块中的 thread::spawn()
函数创建一个原生操作系统线程。spawn 方法接受一个闭包作为参数。
这是 thread::spawn()
的语法,
thread::spawn(|| {
// 线程中要执行的代码
})
现在,让我们看一个例子。
use std::thread;
use std::time::Duration;
fn main() {
// 创建一个线程
thread::spawn(|| {
// 这里的一切都在一个独立的线程中运行
for i in 0..10 {
println!("{} 来自产生的线程!", i);
thread::sleep(Duration::from_millis(2));
}
});
// 主线程
for i in 0..5 {
println!("{} 来自主线程!", i);
thread::sleep(Duration::from_millis(1));
}
}
输出
0 来自主线程!
0 来自产生的线程!
1 来自主线程!
1 来自产生的线程!
2 来自主线程!
3 来自主线程!
2 来自产生的线程!
4 来自主线程!
在上述示例中,我们使用 thread::spawn()
函数创建了一个线程。该线程循环 0..5
并打印当前值。
同样地,我们在主线程中循环 0..5
并打印当前值。
我们还调用了 thread::sleep
来强制一个线程暂停执行一段时间,让另一个线程运行。
请注意,我们在产生的线程中休眠 2 毫秒,在主线程中休眠 1 毫秒。
这个程序的输出每次可能略有不同。重要的是要记住,如果主线程完成,无论其他线程是否完成运行,所有其他线程都会被关闭。
因此,尽管产生的线程应该打印到 i
为 9,但它只达到了 2,因为主线程关闭了。
Rust 中的 Join 句柄
产生的线程总是返回一个 join 句柄。如果我们希望产生的线程完成执行,我们可以将 thread::spawn
的返回值保存在一个变量中,然后在其上调用 join()
方法。
JoinHandle