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线程相关联,但我不知道如何让线程唤醒。
如果你想被一个事件唤醒,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)
在这里,第二个线程至少每两秒唤醒一次(超时),但在通过通道发送某些内容时也会更早。
| 归档时间: |
|
| 查看次数: |
514 次 |
| 最近记录: |