正在Rust中唤醒sigint上的休眠线程吗?

时间:2019-07-15 18:05:08

标签: multithreading rust sleep sigint

考虑以下简单的Rust程序:

use std::time::Duration;
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
use ctrlc;

static running: AtomicBool = AtomicBool::new(true);

fn main() {

    // Set up a thread that registers the sigint signal.
    ctrlc::set_handler(|| {
        running.store(false, Ordering::SeqCst);
    });

    // Loop as long as the signal has not been registered.
    while running.load(Ordering::SeqCst) {
        println!("Hello!");
        thread::sleep(Duration::from_secs(10));
    }
    println!("Goodbye!");

}

它打印“你好!”每十秒钟一次,直到有人按下Ctrl + C,然后在其上打印“再见!”。然后退出。问题是如果线程进入睡眠状态后立即按了Ctrl + C。然后,用户必须等待近十秒钟,直到程序退出。

是否有任何方法可以解决此问题,并且在收到sigint信号后以某种方式唤醒线程?如果有帮助,我准备将ctrlc依赖项更改为其他内容。

我能想出的唯一解决方案是,以十一秒的间隔睡觉,而是检查sigint,然后在每次唤醒时再次回到睡眠状态。有没有更简单,更漂亮的方法?

1 个答案:

答案 0 :(得分:1)

正如doc所说:

  

在Unix平台上,底层的系统调用可能会被虚假的唤醒或信号处理程序中断。为了确保至少在指定的持续时间内发生睡眠,此函数可以多次调用该系统调用。不支持纳秒级睡眠精度的平台会将dur舍入为它们可以睡眠的最接近时间粒度。

因此,我建议您直接使用较低级别的function,有一个包装它shuteye的板条箱,但我不知道它是否是一个好包装。