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
四舍五入到最接近的睡眠时间粒度
所以,我建议你直接使用一个较低的级别,有一个板条箱封装它,但我不知道它是否是一个好的