我有一小部分確定性工作,只需要十三條機器指令即可完成。因爲第一條指令需要一個自制的信號量(spinlock)並且最後一條指令釋放它,所以我可以安全地使用其他內核上運行的所有其他線程,因爲它們試圖獲取並提供相同的信號量。如何避免在用戶模式下搶佔我的線程
當某個線程在完成其「臨界區」之前中斷了一個持有信號量的線程時,會出現問題。最糟糕的情況是中斷會在握住信號量的同時殺死線程,或者可能會發生通常競爭信號量的線程之一分支出代碼,這些代碼可能會產生導致死鎖的中斷。
當他們分支到我無法控制的代碼部分時,我沒有辦法與這些其他線程同步。我認爲我需要禁用中斷,就像我以前在VxWorks中使用的那樣,當我在內核模式下運行時會這樣做。它總是十三條指令,如果在必須完成所有十三條指令之前我必須完成中斷,我總是完全安全。哦,這是我所有的內部數據,除此之外,自制的信號燈沒有任何東西可以鎖定其他任何東西。
我讀過幾個我認爲很接近的答案。大部分都與Windows API上的Critical Section調用有關(錯誤的操作系統,但也許是正確的概念)。大多數錯誤的解決方案都假設我可以讓所有有問題的線程使用我用pthread庫創建的互斥鎖。
我需要在Linux和Solaris上的C/C++中使用此解決方案。
約翰尼崩潰的問題是非常接近 prevent linux thread from being interrupted by scheduler
KermitG也 Can I prevent a Linux user space pthread yielding in critical code?
感謝您的考慮。
使用線程庫中的互斥體(pthread)並仔細閱讀文檔。不要實現你自己的同步原語。並行編程很難:) – 2012-04-09 20:52:07
@RafałRawicki:「不要做任何事情,因爲它很難。」他可能只是需要,因爲互斥體是廢話。 – Cartesius00 2012-06-24 17:12:17
[防止Linux線程被調度程序中斷]可能的重複(http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) – 2015-09-23 19:57:55