是否有可能强制恢复睡眠线程?

时间:2017-05-14 07:29:57

标签: multithreading rust

是否可以强制恢复已暂停的休眠线程?例如,通过调用sleep

std::thread::sleep(std::time::Duration::from_secs(60 * 20));

我知道我可以使用std::sync::mpsc在线程之间进行通信,但如果线程处于睡眠状态,则不会强制它在指定的时间之前唤醒。

我原以为使用std::sync::mpsc而且可能 与该线程关联的Builder.name,但我不知道如何让线程唤醒。

2 个答案:

答案 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的唤醒定时睡眠,但它也可以提早醒来。

请参阅std::thread module documentation