并发编程精解

发布时间:2025年1月6日

并发编程基础

Rust 的类型系统和所有权规则帮助我们正确地编写并发代码。

线程基础

创建新线程并等待其完成:

线程创建示例
use std::thread;
use std::time::Duration;

fn main() {
    let handle = thread::spawn(|| {
        for i in 1..10 {
            println!("hi number {} from the spawned thread!", i);
            thread::sleep(Duration::from_millis(1));
        }
    });

    handle.join().unwrap();
}

消息传递

使用通道在线程间传递消息:

消息传递示例
use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();

    thread::spawn(move || {
        let val = String::from("hi");
        tx.send(val).unwrap();
    });

    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}

共享状态

使用互斥锁在线程间共享数据:

互斥锁示例
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}

Send 和 Sync trait

这两个 trait 标记了可以安全地在线程间传递和访问的类型:

Send 和 Sync 示例
// Send: 可以在线程间传递所有权
fn transfer_ownership(data: impl Send) {
    thread::spawn(move || {
        // data 的所有权被转移到新线程
        println!("Processing data in new thread");
    });
}

// Sync: 可以在线程间共享引用
fn share_data(data: &T) {
    thread::spawn(move || {
        // 可以安全地在多个线程中访问 data
        println!("Accessing data from multiple threads");
    });
}

练习

尝试完成以下并发编程练习:

  1. 创建一个多线程计数器程序
  2. 实现生产者-消费者模式
  3. 使用线程池处理并行任务
返回首页