2014-03-06 164 views
2

我有一個多線程C/C++程序,它非常頻繁地爲讀取和寫入請求提供服務。爲了同步目的,我使用了一個互斥鎖來解鎖。所有讀取和寫入線程在執行操作之前都會獲得鎖定。如果一個線程獲取了鎖定,並且在釋放鎖定之前會發生什麼中斷?該線程會恢復執行,否則我將不得不手動處理它?如果在獲得互斥鎖後發生中斷,會發生什麼情況

+0

沒有人會奇蹟般地解除鎖定互斥。用鎖編程的缺點是等待時間可能會很長,並且會發生死鎖。 (也就是說,中斷處理程序通常會將執行返回到最終停止的地方。) –

回答

3

用戶端鎖定,包括Mutexes不會阻止中斷。這很重要,因爲通常互斥鎖可能用於保護從磁盤上的文件讀取數據,或保護從網絡接收數據包等,其結果依賴於中斷。

實質上,如果有中斷,就會發生「無」。與其他時間一樣,中斷由操作系統處理。在這種情況下,程序不需要做任何事情,如果發生這種情況,只需要幾微秒或幾毫秒就可以完成任務。

某些內核端鎖定(如SpinLock)確實會阻止(在該處理器核心上)中斷,以確保在此過程中不會調度其他進程/線程。在這些情況下,內核可以使用哪些函數還有一些限制 - 例如,在執行期間不可能調用阻塞函數(例如睡眠,等待事件或文件讀取或文件寫入)這一次,因爲這可能會導致內核鎖定。

1

線程最終會恢復執行,它可能在內核服務中斷後立即發生,或者內核調度程序可能決定分派另一個準備運行的線程。如果被中斷的線程獲得了嚴重競爭的鎖定,則其他嘗試獲取該鎖定的線程將阻塞(或旋轉,或旋轉,然後根據互斥體的實現進行阻塞),直到中斷的線程再次分派,完成關鍵部分由鎖保護,並將其解鎖。

在需要近實時性能的悉心調教系統做是爲了關鍵線程分配給自己的核心(CPU親和力)和中斷映射到其他核心。此外,還要小心使用鎖,有時使用無鎖的算法。

0

線程鎖定的事實不受信號的影響。如果線程有鎖並收到信號,則不會發生任何特殊情況。實際上,信號和線程混合不好,因爲信號是根據流程設計的。那是因爲你無法知道哪個線程會得到信號。處理這個問題的正確方法是有一個特定的線程來管理信號,例如阻塞每個線程中的所有信號,但只有一個信號處理信號。這是在具有線程的軟件中處理信號的正確方法。

相關問題