2015-09-23 2 views
0

Независимо от того, сколько раз я запустить программу, она всегда показывает числа в том же порядке:станд :: синхронизация :: MPSC :: канал всегда в том же порядке

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 

Если я перестрою проект, последовательность изменится. Является ли последовательность во время компиляции?

+4

Обратите внимание, что игровая площадка кэширует выходные данные, поэтому, если вы дважды запускаете ту же программу без ее изменения, вы получите тот же результат. Когда я нажимаю на ссылку на игровое поле и запускаю его, я получаю ту же последовательность, что и вы. Когда я добавил пробел в конец последней строки, чтобы принудительно возобновить работу, я получил немного другую последовательность. –

ответ

3

Какой порядок вы ожидаете от поездки? Для чего это стоит, на моей машине я дважды запускал один и тот же двоичный файл и получил несколько разные результаты.

В конечном счете, это сводится к тому, как ваша операционная система решает запланировать потоки. Вы создаете 10 новых потоков, а затем попросите ОС запустить каждый из них, когда это удобно. Гипотетический планировщик потоков может выглядеть следующим образом:

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

Где threads хранит потоки в порядке их создания. Маловероятно, что любая ОС была бы такой наивной, но она показывает эту идею.

В вашем случае каждый поток готов к немедленному запуску и очень короткий, поэтому он может полностью завершить работу до истечения времени.

Кроме того, для блокировки, которая защищает канал, может быть справедливо справедливо. Возможно, он всегда позволяет первому из нескольких конкурирующих потоков представить значение. К сожалению, каналы implementation достаточно сложны, поэтому я не могу сразу сказать, если это так или нет.

Смежные вопросы