rust多线程
约 378 字大约 1 分钟
2026-06-21
线程thread
- spawn: 创建新线程
- move: 移动所有权
channel
多生产者单消费者设施:std::sync::mpsc
例子来自链接
use std::thread;
use std::sync::mpsc;
use std::time::Duration;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let vals = vec![
String::from("hi"),
String::from("from"),
String::from("the"),
String::from("thread"),
];
for val in vals {
tx.send(val).unwrap();
thread::sleep(Duration::from_secs(1));
}
});
for received in rx {
println!("Got: {}", received);
}
}说明
虽然mpsc是多生产者单消费者设施,但 mpsc::channel() 返回元组,第一个元素为生产者,第二个元素为消费者。将生产者 clone 实现多生产者。
互斥体Mutex
rust的互斥体和c++的互斥体 std::mutex 有很大区别。
C++ 用法
#include <print>
#include <mutex>
#include <jthread>
std::mutex mtx;
int main() {
int data = 0;
std::jthread t([&] {
std::lock_guard<std::mutex> lock(mtx);
data = 42;
});
std::jthread t2([&] {
std::lock_guard<std::mutex> lock(mtx);
std::print("{}", data);
});
}Rust 用法
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let d1 = Arc::clone(&data);
let t1 = thread::spawn(move || {
let mut num = d1.lock().unwrap();
*num = 42;
});
let d2 = Arc::clone(&data);
let t2 = thread::spawn(move || {
let num = d2.lock().unwrap();
println!("{}", *num);
});
t1.join().unwrap();
t2.join().unwrap();
}关键区别
可以看出来rust的Mutex和数据是强关联的——new 函数直接使用数据做参数,c++的mutex和数据无关,他保护哪些数据则完全由程序员控制。
这是rust要求使用任何数据前强制 lock,否则直接使用类型是 MutexGuard。
