Как 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).

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

Другие вопросы по тегам