我的主方法的片段:
std::atomic_bool runflag;
// ...
std::thread signaller([&] () mutable {
while (runflag) {
int sig;
int rcode = sigwait(&set, &sig);
if (rcode == 0) {
switch (sig) {
case SIGINT: {
//處理 ^C
}
}
}
}
})。
while (runflag) {
next = cin.get()。
//處理字符輸入。
}
signaller.join()。
我正在使用基于sigwait()的方法來檢測從命令列發送的SIGINT。
signaller執行緒使用sigwait()來監聽信號。當runflag被設定為false時,程式就會終止。然而,當這種情況發生時,signaller執行緒仍然會在sigwait處被阻塞。我不認為我可以使用條件變數,因為sigwait沒有辦法鉤住一個條件變數。有沒有其他的解決方案,最好不是只適用于Linux?
編輯1:另外,是否有一個可中斷的 sigwait 版本?
uj5u.com熱心網友回復:
你可以使用sigtimedwait()函式,它在作為引數的超時后回傳。
你將需要檢查sigtimedwait()的回傳值,以檢查它是否因為超時而結束或信號到達,然后根據這個值,你將需要處理信號或只是檢查runflag并再次運行sigtimedwait()。
下面是另一個答案中關于它的更多內容。 https://stackoverflow.com/a/58834251/11424134
uj5u.com熱心網友回復:
你可以通過讓行程向自己發送另一個信號來喚醒信號處理執行緒,例如。
kill(getpid(), SIGUSR1) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308319.html
標籤:
上一篇:如何將字串按特定順序分割成若干行
