回答
你使用的鎖取決於你的平臺,但通常會有一些互斥體的味道。在Windows上,您將使用關鍵部分,而在.NET中,您將使用顯示器。我不太瞭解其他平臺上的鎖定機制。我會遠離無鎖定的方法。他們很難正確編程,並且性能提升往往不如您預期的那麼好。
鎖定在您的程序中受到嚴重爭奪時成爲瓶頸。也就是說,大量的線程都試圖同時獲取鎖。這會浪費很多CPU週期,因爲線程被阻塞,並且OS在線程之間花費越來越多的時間切換。這類問題最常出現在服務器領域。對於桌面應用程序,鎖很少會導致性能問題。
「爲什麼鎖定可能會成爲多線程程序的瓶頸?」 - 想一想turnstile(也稱爲擋板門),它只允許一個人一次通過,有一羣人等待通過它。
對於隊列,請使用您的環境提供的最簡單的鎖定。
鎖的價格昂貴,因爲它們需要在算法中間進行操作系統調用,而且在創建CPU時很難正確執行。
作爲一個程序員,最好是離開鎖在你的數據結構中的專家,而是用好這樣multithreaded libraryIntel's TBB
爲隊列,您可能需要使用原子指令(硬)或自旋鎖(更容易),因爲它們比互斥體便宜。如果你正在做很多需要鎖定的工作,即修改一個複雜的樹形結構,請使用互斥鎖
在我熟悉的線程包中,您的互斥鎖選項是遞歸的並且是非遞歸的。你應該選擇非遞歸 - 你所有的訪問都是lock(); queue_op();解鎖(),所以沒有必要能夠獲得兩次鎖。
對於隊列,很容易寫一個無鎖的實現(谷歌遠)
鎖是瓶頸,因爲他們力所碰到的所有其他線程停止做他們正在做什麼,並等待鎖打開,從而浪費時間。多線程背後的想法之一是在任何給定的時間使用盡可能多的處理器。通過強制線程等待鎖定,應用程序本質上放棄了它可能使用的處理能力。
「爲什麼鎖定可能會成爲多線程程序的瓶頸?」 因爲等待的線程一直處於阻塞狀態,直到共享內存被解鎖。
建議你閱讀這篇文章的「併發:每個開發必須瞭解多線程應用程序」 http://msdn.microsoft.com/en-au/magazine/cc163744.aspx
- 1. MSMQ可以解決多線程服務的性能瓶頸嗎?
- 2. Jython中隱藏的多線程瓶頸?
- 3. 瓶頸上的Tensorflow:多線程錯誤
- 4. 查找.NET多線程瓶頸
- 5. Eigen程序中的性能瓶頸
- 6. 爲什麼groupBy瓶頸我的管道?
- 7. pthread_join正在成爲瓶頸
- 8. 什麼是UMThunkStubAMD64,它爲什麼會出現瓶頸?
- 9. C++。多線程瓶頸縮小到列表中的單線程應用程序
- 10. 並行程序:如何找到瓶頸(CPU綁定線程)
- 11. 爲什麼單線程java程序有這麼多的線程?
- 12. 找到瓶頸。 Ffmpeg不使用4核心8線程CPU的800%。爲什麼?
- 13. 在Java中創建線程可能是瓶頸嗎?
- 14. Rails應用程序能夠慢到足以成爲瓶頸,而不是db?
- 15. 爲什麼printf不能在多線程程序中工作?
- 16. 爲什麼我的程序通過擁有線程生成LdrpLoaderLock死鎖?
- 17. 什麼能在PHP中實現瓶頸cURL的多功能?
- 18. 不確定爲什麼會產生這麼多線程
- 19. 瓶頸3000+線程.NET應用程序(HttpWebReqsuest.BeginGetResponse)
- 20. 瓶頸應用程序與後臺線程
- 21. Web應用程序的瓶頸?
- 22. 鎖定多線程
- 23. 自定義排序功能瓶頸
- 24. 爲什麼Thread.interrupt()不能中斷試圖獲取鎖的線程
- 25. 爲什麼我可以在單線程FLTK應用程序中死鎖?
- 26. 爲什麼我的多線程程序按順序執行?
- 27. 爲什麼這個線程管理模式會導致死鎖?
- 28. 如何找到多線程服務中的瓶頸?
- 29. std :: move()作爲性能瓶頸?
- 30. Perl會成爲這種圖像處理的瓶頸嗎?
你的問題有點不清楚。你能重申一下嗎? – 2009-06-09 04:16:59