线程同步
消息通道
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建一个消息通道,返回一个元组:(发送者,接收者)
let (tx, rx) = mpsc::channel();
// 创建线程,并发送消息
thread::spawn(move || {
tx.send(1).unwrap();
});
// 在主线程中接收子线程发送的消息
println!("receive {}", rx.recv().unwrap());
// try_recv() 尝试接收一次消息,当通道没有消息时,立即返回错误
// println!("receive {:?}", rx.try_recv());
drop(tx);
}
接收消息的操作
rx.recv()
会阻塞当前线程,直到读取到值,或通道被关闭
多发送者
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
let tx1 = tx.clone();
thread::spawn(move || {
tx.send(String::from("hi from raw tx")).unwrap();
});
thread::spawn(move || {
tx1.send(String::from("hi from cloned tx")).unwrap();
});
for received in rx {
println!("Got: {}", received);
}
}
同步通道
消息通道默认是异步。mpsc::sync_channel(i)
同步通道发送消息是阻塞的,只有在消息被接收后才解除阻塞。其中,传入参数i
,为同步通道的消息缓存条数。当消息缓冲队列满后,才会被阻塞。
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
fn main() {
let (tx, rx) = mpsc::sync_channel(0);
let handle = thread::spawn(move || {
println!("发送之前");
tx.send(1).unwrap();
println!("发送之后");
});
println!("睡眠之前");
thread::sleep(Duration::from_secs(3));
println!("睡眠之后");
println!("receive {}", rx.recv().unwrap());
handle.join().unwrap();
}
输入:
睡眠之前
发送之前
//···睡眠3秒
睡眠之后
receive 1
发送之后