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谢谢你的评论,我现在用例子补充了一个完整的答案。我希望这能解释你的大部分问题谢谢,公园是我最好的选择