Multithreading 可以强制恢复休眠线程吗?

Multithreading 可以强制恢复休眠线程吗?,multithreading,rust,Multithreading,Rust,是否可以强制恢复已暂停的休眠线程?例如,通过调用sleep: std::thread::sleep(std::time::Duration::from_secs(60 * 20)); 我知道我可以使用std::sync::mpsc在线程之间进行通信,但是如果线程处于休眠状态,这不会强制它在指定的时间之前醒来 我认为使用std::sync::mpsc和 Builder和.name与线程关联,但我不知道如何唤醒线程。如果您想被事件唤醒,thread::sleep()不是正确的函数,因为它不应该被停

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

std::thread::sleep(std::time::Duration::from_secs(60 * 20));
我知道我可以使用
std::sync::mpsc
在线程之间进行通信,但是如果线程处于休眠状态,这不会强制它在指定的时间之前醒来

我认为使用
std::sync::mpsc

Builder
.name
与线程关联,但我不知道如何唤醒线程。

如果您想被事件唤醒,
thread::sleep()
不是正确的函数,因为它不应该被停止

在被事件唤醒时,还有其他等待方法(通常称为阻塞)。最简单的方法可能是将频道与一起使用。通常通过频道发送
()
就足够了。这样我们只传递一个信号,而不发送实际数据

如果您不想在特定超时后醒来,但只想在信号到达时醒来,只需使用


超时的示例:

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();
        }
    }
}

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

park\u timeout
允许定时睡眠,并从
unpark
唤醒,但它也可以更早被唤醒


我认为这是不可能的,但是
sleep()
无论如何都不应该这样做。如果你想被唤醒,你应该在一个通道或互斥体上进行阻塞等待。当您在空通道上说
recv()
时,调用线程将阻塞,直到通道不再为空为止。阻塞等待和调用
sleep()
基本上没有区别(当然,除了等待可能被唤醒)。@LukasKalbertodt我的英语不是很好,但是如果我正确理解它所说的内容,那么使用
让mut result=rx.recv().unwrap()是可能的
可以是一种替代方法,但不能在该线程中使用
thread::sleep
,以确定默认情况下它将休眠多长时间,或者直到程序中发生操作为止。但是如果,我可以创建一个函数来控制何时由通道发送,何时经过某个时间,以及在激活线程的操作发生时通过通道发送。如果不能唤醒一个线程,我想被评论的可能是一个线程alternati@LukasKalbertodt谢谢你的评论,我现在用例子补充了一个完整的答案。我希望这能解释你的大部分问题谢谢,公园是我最好的选择