我不認爲這是重複的。我有一個非常具體的問題,當調用一個信號處理程序時,其他線程會發生什麼。Linux:信號對多線程的影響
我有一個使用硬件的多線程程序。在獲取SIGTERM(來自父進程)時,我希望信號處理程序將硬件的狀態設置爲給定狀態,然後退出(1)。我明白,因爲我沒有使用信號掩碼,所以主線程會處理信號。但是它是一個多處理器系統(樹莓派),其他線程都以高優先級運行。他們可能是睡着了,但他們也可能會碰到硬件。
如果所有其他線程在信號到達時凍結,我很好 - 我直接從信號處理程序調用exit(),其他線程永遠不會再運行。但是如果它們可以獨立運行,那麼在處理程序中設置了所需的狀態之後,但在退出之前,它們可能會與硬件有關。而且我找不到描述效果的文檔。如果「凍結一切,但信號處理程序」不是默認的,是否有辦法獲得該行爲?
我可以重新設計代碼,將所有硬件處理放在一個線程中,並讓該線程處理中斷,但這很不方便 - 我現在擁有的線程佈局做了很好的分工,每個線程都知道它可以使用哪些硬件觸摸和什麼時候。我寧願不重新設計。
不過,在信號處理程序中不能做到「讓你的信號處理線程獲得鎖定」,但在信號處理程序中使用互斥體是不安全的。 – nos
@nos好點。最好讓信號處理程序設置一個標誌,並在從信號處理程序返回後執行其餘的操作。 –
這就是我所害怕的。我知道我無法做互斥體解決方案(我的擔心之一是wiringPi在封面下使用了互斥體,這將使任何解決方案無法單線程訪問硬件)。我可能不得不重新設計。謝謝。 – user15001