2009-06-09 84 views

回答

3

你使用的鎖取決於你的平臺,但通常會有一些互斥體的味道。在Windows上,您將使用關鍵部分,而在.NET中,您將使用顯示器。我不太瞭解其他平臺上的鎖定機制。我會遠離無鎖定的方法。他們很難正確編程,並且性能提升往往不如您預期的那麼好。

鎖定在您的程序中受到嚴重爭奪時成爲瓶頸。也就是說,大量的線程都試圖同時獲取鎖。這會浪費很多CPU週期,因爲線程被阻塞,並且OS在線程之間花費越來越多的時間切換。這類問題最常出現在服務器領域。對於桌面應用程序,鎖很少會導致性能問題。

2

「爲什麼鎖定可能會成爲多線程程序的瓶頸?」 - 想一想turnstile(也稱爲擋板門),它只允許一個人一次通過,有一羣人等待通過它。

對於隊列,請使用您的環境提供的最簡單的鎖定。

0

鎖的價格昂貴,因爲它們需要在算法中間進行操作系統調用,而且在創建CPU時很難正確執行。

作爲一個程序員,最好是離開鎖在你的數據結構中的專家,而是用好這樣multithreaded libraryIntel's TBB

爲隊列,您可能需要使用原子指令(硬)或自旋鎖(更容易),因爲它們比互斥體便宜。如果你正在做很多需要鎖定的工作,即修改一個複雜的樹形結構,請使用互斥鎖

0

在我熟悉的線程包中,您的互斥鎖選項是遞歸的並且是非遞歸的。你應該選擇非遞歸 - 你所有的訪問都是lock(); queue_op();解鎖(),所以沒有必要能夠獲得兩次鎖。

1

對於隊列,很容易寫一個無鎖的實現(谷歌遠)

鎖是瓶頸,因爲他們力所碰到的所有其他線程停止做他們正在做什麼,並等待鎖打開,從而浪費時間。多線程背後的想法之一是在任何給定的時間使用盡可能多的處理器。通過強制線程等待鎖定,應用程序本質上放棄了它可能使用的處理能力。

1

「爲什麼鎖定可能會成爲多線程程序的瓶頸?」 因爲等待的線程一直處於阻塞狀態,直到共享內存被解鎖。

建議你閱讀這篇文章的「併發:每個開發必須瞭解多線程應用程序」 http://msdn.microsoft.com/en-au/magazine/cc163744.aspx

相關問題