Multithreading 唤醒一根沉睡的线?

Multithreading 唤醒一根沉睡的线?,multithreading,rust,sleep,sigint,Multithreading,Rust,Sleep,Sigint,考虑以下简单的防锈程序: 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::se

考虑以下简单的防锈程序:

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信号时以某种方式唤醒线程?如果有帮助的话,我准备改变对其他东西的依赖

我能想出的唯一解决办法是每隔10秒睡一次,每次醒来时检查sigint,然后再回去睡觉。有没有更简单、更漂亮的方法呢?

正如上面所说:

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

所以,我建议你直接使用一个较低的级别,有一个板条箱封装它,但我不知道它是否是一个好的