我正在撰寫一個 Rust 程式,每 2 秒執行一次操作。該程式還使用ctrlccrate 來處理中斷。但是,在某些情況下,我在終止行程時最多需要等待 2 秒。我正在使用默認std::thread::sleep功能,我似乎無法中斷。
我的問題來了。我可以讓我的程式以可中斷的方式休眠嗎?換句話說,Rust 是否具有中斷休眠程式的默認功能?我知道當收到 SIGINT 信號時,C 會自動中斷任何睡眠功能。
uj5u.com熱心網友回復:
您的信號處理程式需要在捕獲信號后以某種方式停止或退出正在運行的執行緒。
退出行程很簡單:std::process::exit()在清理完成后呼叫信號處理程式。
將信號轉發到您的睡眠執行緒更難,您可以通過Arc<AtomicBool>在捕獲 SIGINT 時設定一些標志并在檢查之間使用較短的間歇性睡眠而不是單個較長的睡眠重復檢查該標志來做到這一點。
您還可以提出基于通道的解決方案,其中 ctrlc 處理程式通過廣播通道與正在運行的執行緒進行通信,并done在退出行程之前等待它們以某種訊息進行回應。此done訊息可以通過關閉處理程式傳遞給正在運行的執行緒的通道的發送端。然后它可以等待超時,然后使用std::process::exit.
uj5u.com熱心網友回復:
如果您只想清理并退出,那么您可以std::process::exit按照其他答案的建議呼叫信號處理程式。但是,如果您希望您的執行緒停止以便您的應用程式可以繼續執行其他任務,您可以使用通道并recv_timeout獲得可中斷的睡眠:
use std::thread;
use std::time::Duration;
use std::sync::mpsc;
let (send, recv) = mpsc::channel();
thread::spawn(move || {
// When you want to sleep
if let Ok(_) = recv.recv_timeout (Duration::from_secs (2)) {
// Sleep was interrupted
return;
}
// Slept for 2s, proceeding
});
// And elsewhere when you want to interrupt the thread:
send.send(());
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366704.html
上一篇:`shared_ptr::use_count()==0`和`shared_ptr::get()!=nullptr`是否有可能?
