以下是使用 std::sync::mpsc 创建和使用通道的基本示例:
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建一个通道,sender 用于发送消息,receiver 用于接收消息
let (sender, receiver) = mpsc::channel();
// 启动一个新线程,用于发送消息
thread::spawn(move || {
sender.send("Hello from the sender thread").unwrap();
});
// 在主线程中接收消息
let received = receiver.recv().unwrap();
println!("Received: {}", received);
}
在这个例子中,mpsc::channel() 创建了一个新的通道,它返回一个 Sender 和一个 Receiver。thread::spawn 启动一个新线程,该线程通过 sender.send() 发送消息。在主线程中,通过 receiver.recv() 接收消息。这里使用了 unwrap() 来处理可能的错误,实际代码中可能需要更复杂的错误处理。
多个发送者和单个接收者
通道的发送端(Sender)可以被克隆,允许多个线程同时发送消息。但接收端(Receiver)是单一的,只能由一个线程接收消息。
use std::sync::mpsc;
use std::thread;
fn main() {
let (sender, receiver) = mpsc::channel();
// 启动两个新线程,每个线程都向通道发送消息
let sender1 = sender.clone();
thread::spawn(move || {
sender.send("Hello from sender 1").unwrap();
});
thread::spawn(move || {
sender1.send("Hello from sender 2").unwrap();
});
// 在主线程中接收两个消息
let received1 = receiver.recv().unwrap();
let received2 = receiver.recv().unwrap();
println!("Received 1: {}", received1);
println!("Received 2: {}", received2);
}
在这个例子中,sender 被克隆为 sender1,两个线程分别向通道发送消息。主线程通过 receiver.recv() 接收两个消息。
使用迭代器接收消息
你也可以使用迭代器(iterator)来接收通道中的消息,直到通道关闭。
use std::sync::mpsc;
use std::thread;
fn main() {
let (sender, receiver) = mpsc::channel();
// 启动一个新线程,定期发送消息
thread::spawn(move || {
for i in 0..5 {
sender.send(i).unwrap();
thread::sleep(std::time::Duration::from_millis(500));
}
});
// 在主线程中使用迭代器接收消息
for received in receiver {
println!("Received: {}", received);
}
}
在这个例子中,for received in receiver 使用了通道的迭代器,直到通道关闭才会退出循环。
通道是 Rust 中一种强大而灵活的线程间通信方式,通过它可以在多个线程之间传递数据,保证线程安全。
转载请注明出处:http://www.zyzy.cn/article/detail/6781/Rust