线程同步

消息通道

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 
发送之后