std :: sync :: mpsc :: channel总是以相同的顺序

时间:2015-09-23 12:34:00

标签: 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();
        }); 
    }

    for _ in 0..10 {
        println!("{}", rx.recv().unwrap());
    }
}

playground上的代码。输出是:

6
7
8
5
9
4
3
2
1
0

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

1 个答案:

答案 0 :(得分:3)

您期望他们在什么顺序?值得一提的是,在我的机器上,我运行了两次相同的二进制文件,结果略有不同。

归根结底,这取决于您的操作系统如何决定调度线程。您创建了10个新线程,然后要求操作系统在方便时运行每个线程。假设的线程调度程序可能如下所示:

for thread in threads {
    if thread.runnable() {
        thread.run_for_a_time_slice();
    }
}

threads按创建顺序存储线程的位置。任何操作系统都不太可能是这种天真,但它显示了这个想法。

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

此外,可能会对保护频道的锁应用一些公平性。也许它总是让多个竞争线程中的第一个提交一个值。不幸的是,implementation频道相当复杂,所以我不能立即说出是否是这种情况。