是否可以强制恢复休眠线程?

Ang*_*gel 2 multithreading rust

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

std::thread::sleep(std::time::Duration::from_secs(60 * 20));
Run Code Online (Sandbox Code Playgroud)

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

我曾想过使用std::sync::mpsc和可能 Builder.name线程相关联,但我不知道如何让线程唤醒。

Luk*_*odt 6

如果你想被一个事件唤醒,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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,第二个线程至少每两秒唤醒一次(超时),但在通过通道发送某些内容时也会更早。