2011-12-13 73 views
3

爲什麼sem_wait不能用於信號處理程序(特別是每個線程的SIGSEGV信號)?有人能給我一個例子,它會使應用程序崩潰嗎?我猜sem_wait折返線程安全,所以這裏有什麼問題?爲什麼不是異步安全sem_wait和信號處理程序

+0

我建議你添加哪種類型的操作(線程,中斷,異常,...)信號量應該保護你。這有很大的不同。 – gnometorule 2011-12-13 17:42:27

回答

1

如果應用程序在信號量的值爲零時接收到信號,並且接收信號的線程碰巧是應該增加信號量值(sem_post)的那個線程?如果你在信號處理程序中調用sem_wait,這個過程將會死鎖,不是嗎?

另一個參數當然可以是,如果sem_wait不在async-signal-safe函數列表中,則實現可以自由調用鼻子惡魔。

3

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

1

sem_wait不能在這個原因的信號處理程序使用:

線程A是調用sem_wait上SEM1。線程A完成後,它會發送到sem1。但是,在它完成之前,收到信號並輸入處理程序,在sem1上調用sem_wait。由於A是會發布到sem1的,所以處理程序將永遠不會返回,並且會產生死鎖。這就是爲什麼永遠不要在信號處理程序中等待任何東西。 ASFAIK的問題與死機相關的問題多於崩潰。此外,這違反了信號處理程序的理想目的,即處理外部中斷,然後回到您正在做的事情上。

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