是否可以强制恢复已暂停的休眠线程?例如,通过调用sleep
:
std::thread::sleep(std::time::Duration::from_secs(60 * 20));
我知道我可以使用std::sync::mpsc
在线程之间进行通信,但如果线程处于睡眠状态,则不会强制它在指定的时间之前唤醒。
我原以为使用std::sync::mpsc
而且可能
与该线程关联的Builder
和.name
,但我不知道如何让线程唤醒。
答案 0 :(得分:4)
如果您想被某个事件唤醒,thread::sleep()
不是正确使用的功能,因为它不应该停止。
还有其他等待的方法可以被事件唤醒(通常称为阻止)。可能最简单的方法是将频道与Receiver::recv_timeout()
一起使用。通常它也足以通过频道发送()
。这样我们只是传达信号,但不发送实际数据。
如果您不希望在特定超时后唤醒,但只有 信号到达时,请使用Receiver::recv()
。
超时示例:
use std::thread;
use std::sync::mpsc::{self, RecvTimeoutError};
use std::time::Duration;
use std::io;
fn main() {
let (sender, receiver) = mpsc::channel();
thread::spawn(move || {
loop {
match receiver.recv_timeout(Duration::from_secs(2)) {
Err(RecvTimeoutError::Timeout) => {
println!("Still waiting... I'm bored!");
// we'll try later...
}
Err(RecvTimeoutError::Disconnected) => {
// no point in waiting anymore :'(
break;
}
Ok(_) => {
println!("Finally got a signal! ♥♥♥");
// doing work now...
}
}
}
});
loop {
let mut s = String::new();
io::stdin().read_line(&mut s).expect("reading from stdin failed");
if s.trim() == "start" {
sender.send(()).unwrap();
}
}
}
这里,第二个线程至少每两秒钟(超时)被唤醒,但是一旦通过频道发送了某些内容,也会更早。
答案 1 :(得分:0)
park_timeout
允许来自unpark
的唤醒定时睡眠,但它也可以提早醒来。