在C#4應用程序中,我使用任務並行庫來並行處理Web請求。得到Web響應後,需要更新一些全局變量,我決定添加一個鎖阻止更新該變量。鎖定語句是獲得互斥的最佳選擇嗎?以及TPL中的鎖語句數量(或鎖定塊的大小)與TPL的性能下降之間的確切關係是什麼?任務並行庫的鎖定語句和性能
1
A
回答
1
您的第一個問題的答案是:是的。和不。您可以使用lock
塊,也可以使用Mutex
,但在單個應用程序的上下文中幾乎沒有實際區別。
第二個問題的答案是:沒有確切的關係。你可以擁有一百萬個鎖,但是隻有當他們阻止彼此時,性能纔會下降,並且會根據阻塞的程度而降低。 (注意:鎖定本身會導致性能損失。)
您的代碼的確切配置文件將決定什麼樣的關係,並且只有通過運行一些測試和發現才能知道。
+0
關於你的第一條語句:實際上'lock'更加輕量級,而'Mutex'是一個操作系統對象,它總是需要從內核分配一個句柄。 'lock'或者'Monitor'在實際阻塞和滿足時僅使用內核原語(在幕後),即在短暫的旋轉時間之後沒有獲得鎖。所以一般來說,使用鎖定最有可能是更好的選擇,除非您需要鎖定跨越多個進程。 – 2012-04-23 16:22:32
1
如果你正在更新單個變量(並且不需要多個更新作爲一個原子單元一起更新),我會使用提供無鎖原子功能的Interlocked類。如果你有很多線程都試圖更新這些變量,Interlocked將有助於減少爭用。
http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx
相關問題
- 1. c#鎖定語句性能
- 2. 鎖定語句和MVC
- 3. 任務並行庫文件句柄
- 4. 任務並行庫和多個並行任務
- 5. 任務並行庫異常句柄「任務已取消」。
- 6. 何時使用併發鎖定語句
- 7. 鎖定和解鎖dispatch_queue_t異步任務
- 8. OpenMP任務並行 - 性能問題
- 9. ThreadLocal的聚合和任務並行庫
- 10. SVN:數據庫被鎖定,正在執行的語句「RELEASE S0」
- 11. C#鎖定單行(if語句)
- 12. 任務並行庫和異常
- 13. C#任務並行庫和NHibernate/Spring.NET
- 14. 鎖定Java任務
- 15. MySQL MyISAM執行更新語句鎖定表並阻止讀取?
- 16. 執行SQL任務失敗的合併語句
- 17. FreeRTOS鎖和任務
- 18. Ruby 1.8.x,鎖定select語句和併發問題
- 19. 使用鎖定語句
- 20. 並行任務庫WaitAny Design
- 21. Quartz.net +任務並行庫
- 22. .NET任務並行庫
- 23. 任務並行庫ArgumentException
- 24. 任務並行庫 - 單核並行度
- 25. 任務並行庫 - 自定義任務計劃程序
- 26. 任務並行性,內存管理和任務結束
- 27. MySQL的鎖定和併發性
- 28. 在Windows鎖定之前執行任務
- 29. InnoDB行級鎖定性能 - 多少行?
- 30. PHP的警告:SQLite3Stmt ::執行():無法執行的語句:數據庫被鎖定
發佈一些示例代碼將有助於爲此得到答案。 – 2012-04-23 15:43:19