Rust 提供了强大的并发编程支持,通过使用线程、消息传递和共享状态的方式,你可以有效地编写并发程序。以下是 Rust 中并发编程的一些基本概念和示例:

1. 线程(Thread):

Rust 的标准库提供了创建和管理线程的功能。
use std::thread;
use std::time::Duration;

fn main() {
    // 创建一个新线程
    let handle = thread::spawn(|| {
        for i in 1..=5 {
            println!("Thread: Count {}", i);
            thread::sleep(Duration::from_millis(500));
        }
    });

    // 主线程继续执行其他操作
    for i in 1..=3 {
        println!("Main Thread: Count {}", i);
        thread::sleep(Duration::from_millis(1000));
    }

    // 等待新线程结束
    handle.join().unwrap();
}

在这个例子中,thread::spawn 创建了一个新线程,然后主线程和新线程并发执行。通过 thread::sleep 实现线程之间的时间间隔。

2. 消息传递(Message Passing):

Rust 的并发模型也包括消息传递,通过通道(channel)进行线程间通信。
use std::sync::mpsc;
use std::thread;

fn main() {
    // 创建一个通道
    let (sender, receiver) = mpsc::channel();

    // 创建一个新线程,发送消息
    thread::spawn(move || {
        let val = String::from("Hello from the other side");
        sender.send(val).unwrap();
    });

    // 主线程接收消息
    let received = receiver.recv().unwrap();
    println!("Received: {}", received);
}

在这个例子中,mpsc::channel 创建了一个多生产者,单消费者的通道。新线程通过 send 发送消息,主线程通过 recv 接收消息。

3. 共享状态(Shared State):

Rust 的 Arc(原子引用计数)和 Mutex(互斥锁)结合使用,可以实现多线程之间的共享状态。
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 创建一个可变共享状态
    let counter = Arc::new(Mutex::new(0));

    // 克隆 Arc,用于多线程共享
    let counter_clone = Arc::clone(&counter);

    // 创建多个线程,修改共享状态
    let handles: Vec<_> = (0..5)
        .map(|_| {
            let counter = Arc::clone(&counter_clone);
            thread::spawn(move || {
                let mut num = counter.lock().unwrap();
                *num += 1;
            })
        })
        .collect();

    // 等待所有线程结束
    for handle in handles {
        handle.join().unwrap();
    }

    // 打印最终结果
    println!("Result: {}", *counter.lock().unwrap());
}

在这个例子中,Arc::new(Mutex::new(0)) 创建了一个原子引用计数的互斥锁,用于多线程共享计数器。多个线程通过 lock 方法获取锁,修改共享状态。

Rust 的并发编程支持通过所有权和生命周期来确保线程安全,避免数据竞争和悬垂引用等问题。使用标准库提供的并发工具,可以编写安全、高效的并发程序。


转载请注明出处:http://www.zyzy.cn/article/detail/13734/Rust