multithreading - 如何控制 Rust 中 2 个不同线程的打印顺序

标签 multithreading rust stdout

我正在编写一个小程序,它部署 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/

相关文章:

java - 在远程服务中使用处理程序

rust - 如何从Reverse()中获取值?

amazon-s3 - 使用原始 https 请求将 Rust AWS API 网关服务代理上传到 S3 文件

rust - 为什么允许使用 `as` 而不是 `From` 从 u64 到 usize 的类型转换?

Python 子进程 - 将 stdout/err 重定向到两个地方

c# - 哪个更快更有效——begininvoke 还是 synchronisecontext.post?

java - 如何限制 ScheduledExecutorService

python - 使用 Pool.map() 将函数作为参数传递给进程目标

Node.js 使用单独的 stdout 和 stderr 流以交互方式生成子进程

linux - 为什么 Laravel Task Scheduler cron 使用 >> 而不是 > 重定向到 dev/null?