Как 999 мкс слишком коротки, но 1000 мкс точно?
Когда я запускаю следующий код, я получаю some output
:
use std::thread::Thread;
static DELAY: i64 = 1000;
fn main() {
Thread::spawn(move || {
println!("some output");
});
std::io::timer::sleep(std::time::duration::Duration::microseconds(DELAY));
}
Но если я установлю DELAY
до 999 я ничего не получаю. Я думаю, что 999 и 1000 достаточно близки, чтобы не вызывать такую разницу, то есть здесь должно быть что-то еще. Я пробовал также с Duration::nanoseconds
(999_999 и 1_000_000), и я вижу то же самое поведение.
Моя платформа - Linux, и я могу воспроизвести это поведение почти все время: используя 999 результатов в some output
в пути менее 1% пробегов.
Как замечание, я осознаю, что такой подход неверен.
2 ответа
sleep
функция спит с шагом в 1 миллисекунду, а если количество миллисекунд меньше 1, оно вообще не спит. Вот соответствующая выдержка из кода:
pub fn sleep(&mut self, duration: Duration) {
// Short-circuit the timer backend for 0 duration
let ms = in_ms_u64(duration);
if ms == 0 { return }
self.inner.sleep(ms);
}
В вашем коде 999 микросекунд сделали его вообще не спящим, и основной поток завершился до того, как порожденный поток мог распечатать свой вывод. Через 1000 микросекунд, т.е. 1 миллисекунду, основная нить спала, что давало возможность порожденной нити работать.
Наиболее вероятно, что ваше ядро настроено на TICK 1000 Гц (один раз с тактовым прерыванием на миллисекунду). Возможно, вы можете улучшить его, перекомпилировав на более мелкие тактовые частоты или ядро без тиканья и перекомпилировав ваше ядро, чтобы обеспечить более точное разрешение тактового генератора. Тактовый такт 1000 Гц в настоящее время является стандартным в ядрах Linux, работающих на ПК (и в большинстве ARM и встроенных Linux).
Это не проблема новичка, поэтому, возможно, вам придется обратиться за локальной помощью, чтобы перенастроить и перекомпилировать ядро, чтобы справиться с большим временным разрешением.