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
按照创建线程的顺序存储线程。不太可能有任何操作系统会如此幼稚,但它表明了这一想法
在您的情况下,每个线程都可以立即运行,并且非常短,因此它可以在时间结束之前一直运行到完成
此外,可能会对保护通道的锁应用一些公平性。也许它总是让多个竞争线程中的第一个提交一个值。不幸的是,通道的数量相当复杂,因此我无法立即说明是否如此。请注意,游乐场缓存输出,因此如果您在不更改的情况下运行同一程序两次,您将获得相同的输出。当我点击你的游乐场链接并运行它时,我得到了与你相同的序列。当我在最后一行的末尾添加一个空格以强制重新运行时,我得到了一个稍微不同的序列。请注意,游乐场缓存了输出,因此如果您在不更改的情况下运行同一程序两次,您将得到相同的输出。当我点击你的游乐场链接并运行它时,我得到了与你相同的序列。当我在最后一行的末尾添加一个空格来强制重新运行时,我得到了一个稍微不同的序列。