一、前言
多线程路径在很多语言中都是绕不开的话题,原因无它:可以提高程序执行效率。
如果不理解线程的,可以先看看下面这两篇文章:
本文重在实践,也就是如何用rust开发多线程程序,以及一些注意细节,并不会再过多讨论相关的概念。
二、启动新线程
在rust中启动新线程是一件很简单的事情,下面直接用一个例子进行说明:
fn main(){
let t=std::thread::spawn(||{
println!("这是一个新线程");
});
let _ = t.join(); //等待线程执行结束
}
上面的代码很简单,就是单纯的用std
中的thread
中的spawn
函数创建一个新线程去打印一个字符串,但由于主线程结束会自动终止其它线程的执行,所以我在后面调用了其上的join
函数来等待新开的线程执行结束。
注意,符号
_
在rust中意思等同于“忽略”,在这里的意思就是不需要返回值,同时可以屏蔽rust编译器的警告。
spawn
函数的作用就是新开一个线程并执行传递进来的函数,这里函数我写的是闭包形式,当然你也可以写一个独立的函数:
fn main() {
let t = std::thread::spawn(new_thread_fun);
let _ = t.join(); //等待线程执行结束
}
fn new_thread_fun() {
println!("这是一个新线程");
}
上面这两段代码是完全等价的,不过为了少写一个函数名,大部分人一般都更乐意用闭包,所以一定要习惯这种写法,后面文章中也会对其进行详细介绍。
rust中的闭包其实和C++中的lambda表达式差不多,其它语言基本都有类似的写法,后面章节会对其做更详细的介绍。
同时spawn
函数新建线程后,还会返回一个实例,该实例可以将其理解为就是我们刚才新建的那个线程。