无论我运行多少次程序,它总是以相同的顺序显示数字:
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());
}
}
playground上的代码。输出是:
6
7
8
5
9
4
3
2
1
0
如果我重建项目,序列将会改变。序列是在编译时决定的吗?
答案 0 :(得分:3)
您期望他们在什么顺序?值得一提的是,在我的机器上,我运行了两次相同的二进制文件,结果略有不同。
归根结底,这取决于您的操作系统如何决定调度线程。您创建了10个新线程,然后要求操作系统在方便时运行每个线程。假设的线程调度程序可能如下所示:
for thread in threads {
if thread.runnable() {
thread.run_for_a_time_slice();
}
}
threads
按创建顺序存储线程的位置。任何操作系统都不太可能是这种天真,但它显示了这个想法。
在您的情况下,每个线程都可以立即运行,并且非常短,因此它可以在时间结束之前一直运行完毕。
此外,可能会对保护频道的锁应用一些公平性。也许它总是让多个竞争线程中的第一个提交一个值。不幸的是,implementation频道相当复杂,所以我不能立即说出是否是这种情况。