Rust std::sync::mpsc::通道始终以相同的顺序

Rust std::sync::mpsc::通道始终以相同的顺序,rust,Rust,无论我运行程序多少次,它总是以相同的顺序显示数字: use std::sync::mpsc::channel; use std::thread; fn main() { let (tx, rx) = channel(); for i in 0 ..10 { let tx = tx.clone(); thread::spawn(move || { tx.send(i).unwrap(); }); }

无论我运行程序多少次,它总是以相同的顺序显示数字:

use std::sync::mpsc::channel;
use std::thread;

fn main() {
    let (tx, rx) = channel();
    for i in 0 ..10 {
        let tx = tx.clone();
        thread::spawn(move || {
            tx.send(i).unwrap();
        }); 
    }

    for _ in 0..10 {
        println!("{}", rx.recv().unwrap());
    }
}
上面的代码。输出为:

6
7
8
5
9
4
3
2
1
0

如果我重建项目,顺序将改变。序列是在编译时决定的吗?

您希望它们的顺序是什么?值得一提的是,在我的机器上,我运行了两次相同的二进制代码,得到的结果略有不同

最终,这取决于您的操作系统决定如何调度线程。创建10个新线程,然后让操作系统在方便的时候运行每个线程。假设的线程调度程序可能如下所示:

for thread in threads {
    if thread.runnable() {
        thread.run_for_a_time_slice();
    }
}
其中
threads
按照创建线程的顺序存储线程。不太可能有任何操作系统会如此幼稚,但它表明了这一想法

在您的情况下,每个线程都可以立即运行,并且非常短,因此它可以在时间结束之前一直运行到完成


此外,可能会对保护通道的锁应用一些公平性。也许它总是让多个竞争线程中的第一个提交一个值。不幸的是,频道的顺序相当复杂,所以我不能马上说是不是这样。

您希望它们的顺序是什么?值得一提的是,在我的机器上,我运行了两次相同的二进制代码,得到的结果略有不同

最终,这取决于您的操作系统决定如何调度线程。创建10个新线程,然后让操作系统在方便的时候运行每个线程。假设的线程调度程序可能如下所示:

for thread in threads {
    if thread.runnable() {
        thread.run_for_a_time_slice();
    }
}
其中
threads
按照创建线程的顺序存储线程。不太可能有任何操作系统会如此幼稚,但它表明了这一想法

在您的情况下,每个线程都可以立即运行,并且非常短,因此它可以在时间结束之前一直运行到完成


此外,可能会对保护通道的锁应用一些公平性。也许它总是让多个竞争线程中的第一个提交一个值。不幸的是,通道的数量相当复杂,因此我无法立即说明是否如此。

请注意,游乐场缓存输出,因此如果您在不更改的情况下运行同一程序两次,您将获得相同的输出。当我点击你的游乐场链接并运行它时,我得到了与你相同的序列。当我在最后一行的末尾添加一个空格以强制重新运行时,我得到了一个稍微不同的序列。请注意,游乐场缓存了输出,因此如果您在不更改的情况下运行同一程序两次,您将得到相同的输出。当我点击你的游乐场链接并运行它时,我得到了与你相同的序列。当我在最后一行的末尾添加一个空格来强制重新运行时,我得到了一个稍微不同的序列。