У меня есть проблемы с пониманием поведения программы в this code sample:Почему некоторые операторы не выполняются при запуске в потоке?
use std::comm;
use std::thread::Thread;
static NTHREADS: uint = 3;
fn main() {
let (tx, rx): (Sender<uint>, Receiver<uint>) = comm::channel();
for id in range(0, NTHREADS) {
let thread_tx = tx.clone();
Thread::spawn(move || {
thread_tx.send(id);
println!("thread {} finished", id);
}).detach();
}
let mut ids = Vec::with_capacity(NTHREADS);
for _ in range(0, NTHREADS) {
ids.push(rx.recv());
}
println!("{}", ids);
}
В частности, я не понимаю, почему некоторые задачи не удается достичь этой линии, когда будучи оторванными:
println!("task {} finished", id);
Но не тогда, когда при соединении с родительским (основным).
Кроме того, почему только вложенные задачи выполняются в заранее определенном порядке?
Как завершить задачу перед выполнением ее кода? –
Поскольку «println! (« Task {} завершен », id); является частью тела кода задачи, как можно выполнить задачу «(быть) до выполнения println»? –
, потому что он выполняется в другой части программы и параллельно, то есть в потоке. Для этого используется поток. Используйте join, чтобы заставить его закончить, прежде чем продолжить. – Gabriel