我正在编写一个小程序,它部署 2 个线程,一个提示用户输入的发送方线程和一个接收输入作为消息并将其打印到标准输出的接收方线程。
简单的运行应该如下所示:
> hello
< hello
但是,使用以下代码示例,它最终看起来像这样:
> hello
> < hello
这是代码:
use std::io;
use std::io::Write;
use std::thread;
use std::sync::mpsc;
fn main() {
let mut threads = vec![];
let (tx, rx) = mpsc::sync_channel(1);
// Sender
threads.push(thread::spawn(move || {
loop {
let mut input = String::new();
print!("> ");
io::stdout().flush().unwrap();
io::stdin().read_line(&mut input).unwrap();
tx.send(input).unwrap();
}
}));
// Receiver
threads.push(thread::spawn(move || {
loop {
let message = rx.recv().unwrap();
println!("< {message}");
}
}));
for thread in threads {
thread.join().unwrap();
}
}
我的假设是,当接收者到达println!("< {message}")
时发件人已到达下一个 print!("> ")
并且两个字符串都以错误的顺序冲在一起,处理这个问题的正确方法是什么?
最佳答案
您可以创建另一个 channel ,以便在接收方完成打印后发回消息,然后通过该 channel 将消息发送给发送方。
在第二个 channel 中,消息类型为()
,即单元类型,不包含任何数据。
// sender
let (unwaiter, waiter) = mpsc::sync_channel(0);
tx.send((input, unwaiter)).unwrap();
waiter.recv().unwrap();
// receiver
let (message, unwaiter) = rx.recv().unwrap();
println!("< {message}");
unwaiter.send(()).unwrap();
关于multithreading - 如何控制 Rust 中 2 个不同线程的打印顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76695567/