2012-04-09 27 views
5

我有一小部分確定性工作,只需要十三條機器指令即可完成。因爲第一條指令需要一個自制的信號量(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?

感謝您的考慮。

+3

使用線程庫中的互斥體(pthread)並仔細閱讀文檔。不要實現你自己的同步原語。並行編程很難:) – 2012-04-09 20:52:07

+1

@RafałRawicki:「不要做任何事情,因爲它很難。」他可能只是需要,因爲互斥體是廢話。 – Cartesius00 2012-06-24 17:12:17

+0

[防止Linux線程被調度程序中斷]可能的重複(http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) – 2015-09-23 19:57:55

回答

3

您可能無法阻止搶佔用戶模式線程。關鍵部分(以及所有其他同步對象)可防止線程發生衝突,但它們決不會阻止它們被操作系統搶佔。

如果您的其他線程分支到上超時東西,而這東西可能導致死鎖 - 你有一個設計問題。

一個正確的設計應該是最悲觀的:搶佔可能會發生在無處不在的時間。

+0

進一步的研究讓我內置的編譯器提供的原子函數。例如GCC 4.7手冊,6.52節介紹了原子操作。我相信我需要一個__atomic_thread_fence,但我不確定是否提供了我需要的搶佔保護。 – wapadomo 2012-04-10 14:57:38