我有一個多線程C/C++程序,它非常頻繁地爲讀取和寫入請求提供服務。爲了同步目的,我使用了一個互斥鎖來解鎖。所有讀取和寫入線程在執行操作之前都會獲得鎖定。如果一個線程獲取了鎖定,並且在釋放鎖定之前會發生什麼中斷?該線程會恢復執行,否則我將不得不手動處理它?如果在獲得互斥鎖後發生中斷,會發生什麼情況
2
A
回答
3
用戶端鎖定,包括Mutexes不會阻止中斷。這很重要,因爲通常互斥鎖可能用於保護從磁盤上的文件讀取數據,或保護從網絡接收數據包等,其結果依賴於中斷。
實質上,如果有中斷,就會發生「無」。與其他時間一樣,中斷由操作系統處理。在這種情況下,程序不需要做任何事情,如果發生這種情況,只需要幾微秒或幾毫秒就可以完成任務。
某些內核端鎖定(如SpinLock)確實會阻止(在該處理器核心上)中斷,以確保在此過程中不會調度其他進程/線程。在這些情況下,內核可以使用哪些函數還有一些限制 - 例如,在執行期間不可能調用阻塞函數(例如睡眠,等待事件或文件讀取或文件寫入)這一次,因爲這可能會導致內核鎖定。
1
線程最終會恢復執行,它可能在內核服務中斷後立即發生,或者內核調度程序可能決定分派另一個準備運行的線程。如果被中斷的線程獲得了嚴重競爭的鎖定,則其他嘗試獲取該鎖定的線程將阻塞(或旋轉,或旋轉,然後根據互斥體的實現進行阻塞),直到中斷的線程再次分派,完成關鍵部分由鎖保護,並將其解鎖。
在需要近實時性能的悉心調教系統做是爲了關鍵線程分配給自己的核心(CPU親和力)和中斷映射到其他核心。此外,還要小心使用鎖,有時使用無鎖的算法。
0
線程鎖定的事實不受信號的影響。如果線程有鎖並收到信號,則不會發生任何特殊情況。實際上,信號和線程混合不好,因爲信號是根據流程設計的。那是因爲你無法知道哪個線程會得到信號。處理這個問題的正確方法是有一個特定的線程來管理信號,例如阻塞每個線程中的所有信號,但只有一個信號處理信號。這是在具有線程的軟件中處理信號的正確方法。
相關問題
- 1. 如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?
- 2. 如果我等待關閉的互斥鎖,會發生什麼?
- 3. 在互斥代碼中發生死鎖
- 4. 如果HttpClient.execute()中斷會發生什麼?
- 5. 未能獲取鎖的線程會發生什麼情況?
- 6. wait()/ signal()塊中的互斥量獲取會發生什麼?
- 7. 如果未捕獲到異常,會發生什麼情況?
- 8. 如果消息在MQ中回滾會發生什麼情況?
- 9. 如果finally塊引發異常,會發生什麼情況?
- 10. 如果CFile :: Write引發異常會發生什麼情況?
- 11. 如果iOS分發證書過期會發生什麼情況?
- 12. 如果我的IExceptionPublisher引發異常,會發生什麼情況?
- 13. 發生病情時會發生什麼情況?
- 14. 如果在rootfs上發生內存泄漏,會發生什麼情況?
- 15. 釋放互斥鎖時發生異常。什麼會造成這種情況?在下面的代碼
- 16. 爲什麼會發生這種情況?
- 17. AppStore,如果您的應用獲得批准,會發生什麼情況?
- 18. 如果委託不存在,會發生什麼情況?
- 19. 如果在SqlDataReader之前關閉SqlConnection,會發生什麼情況?
- 20. 如果爲單箇中斷創建多個ISR,會發生什麼情況?
- 21. 如果在Application_Start中引發未處理的異常,會發生什麼情況?
- 22. ReleaseMutex之前在互斥體上的CloseHandle - 會發生什麼?
- 23. 如果未處理事件會發生什麼情況?
- 24. 如果有人拿到我的appsecret,會發生什麼情況?
- 25. 如果php.ini丟失,會發生什麼情況?
- 26. minimax:如果min不起作用會發生什麼情況
- 27. 如果您打破Lock()語句,會發生什麼情況?
- 28. 如果NSURLCache已滿,會發生什麼情況?
- 29. 如果我不調用transaction.close或transaction.rollback,會發生什麼情況?
- 30. 如果Web服務更改參數會發生什麼情況?
沒有人會奇蹟般地解除鎖定互斥。用鎖編程的缺點是等待時間可能會很長,並且會發生死鎖。 (也就是說,中斷處理程序通常會將執行返回到最終停止的地方。) –