簡體   English   中英

sem_wait和信號處理程序

[英]sem_wait and signal handler

為什么sem_wait不能在信號處理程序中使用(特別是每個線程的SIGSEGV信號)? 有人可以給我一個示例場景,它會使應用程序崩潰嗎? 我猜sem_wait可重入的線程安全的 ,所以這里有什么問題? 為什么它不是異步安全的

異步安全是一個比線程安全更嚴格的要求。 您可以使用基元編寫線程安全代碼,以保護關鍵部分的全局數據。 信號處理程序不能依賴於此。 例如,您可能位於sem_wait內的關鍵部分內,同時執行導致段錯誤的操作。 這會破壞sem_wait的線程安全保護。

如果應用程序在信號量的值為零時接收到信號,並且接收信號的線程恰好是應該增加信號量值(sem_post)的線程,該怎么辦? 如果你在信號處理程序中調用sem_wait,那么進程會死鎖,不是嗎?

另一個論點當然可能是,如果sem_wait不在異步信號安全函數列表中,則實現可以自由地調用鼻子惡魔。

由於這個原因,sem_wait不能在信號處理程序中使用:

線程A在sem1上調用sem_wait。 線程A完成后,它會發布到sem1。 但是,在它完成之前,接收信號然后輸入處理程序,在sem1上調用sem_wait。 因為A是發布到sem1的那個,所以處理程序永遠不會返回,你將遇到死鎖。 這就是為什么永遠不要等待信號處理程序中的任何事情的原因。 問題,ASFAIK,更多的是死鎖而不是崩潰。

此外,這違反了信號處理程序的理想目的,即處理外部中斷然后快速恢復到您正在做的事情。

最后,擺脫SIGSEGV而不是處理它不是一個更好的目標嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM