2011-04-27 35 views
3

今天我在MSDN碰到這個傳來:臨界區的變化在Windows 2003 SP1

「與Windows Server 2003 帶有Service Pack 1(SP1)開始,線程 等待一個臨界區不 收購的臨界區 先來先服務的基礎。這 變化增加性能 顯著的大多數代碼。但是, 一些應用程序依賴於先入 先出(FIFO)順序和可 執行poo 當前版本的Windows( 示例,使用臨界區段作爲 速率限制器的 應用程序)。爲確保您的 代碼繼續正常工作,您可能需要添加 同步的其他級別。例如,假設 您有一個生產者線程和一個 消費者線程正在使用 臨界區對象來同步 他們的工作。創建兩個事件對象, 一個用於每個線程用於通知 它已準備好爲其他線程 繼續。消費者線程將 等待生產者進入臨界 部分之前的信號其 事件,生產者線程將 等待消費者線程進入臨界 部分之前的信號 它的事件。 。每個線程離開 臨界區之後,它標誌着其事件 釋放其他線程」

起初,我還以爲跆拳道? - 我一直認爲線程將收購秩序的一個關鍵部分他們試圖獲得它,雖然這似乎是一個服務包行爲奇怪的巨大變化,該服務包是針對服務器版的Windows和Vista正在開發當時我相信的時間

無論如何,所以它有點意義 - 這種方式下調度器旋轉的下一個等待線程將成爲下一個得到關鍵部分的線程,至少我假設這是唯一的因此,除非他們決定爲了好玩而做一個隨機選擇;)。

不過,這是一個我已經做出的假設,現在正在評估我的代碼,以確保沒有任何FIFO依賴的情況是一個問題。

有沒有人有任何現實世界的問題呢?雖然獲取關鍵部分的線程的順序不能保證是FIFO,但它通常不是FIFO?如果不是通常是 FIFO(或接近FIFO),有沒有人知道一個線程可以等待一個嚴重競爭的關鍵部分多長時間?如果它是低優先級的線程,這是否意味着如果始終有更高優先級的線程試圖獲取臨界區(即使低優先級線程很早之前如果遵守FIFO則下一個在線),這是否意味着它可能幾乎無限期地等待)?是否有避免這種情況的安全措施,或者是否依賴於授權的輔助同步對象?

當然,這真的只是一個真正嚴重有爭議的關鍵部分。

我不知道,也許我做得太多了......但有些事情讓我困擾。任何見解都會被讚賞。謝謝;)

回答

1

在我的經驗,關鍵部分有從未了FIFO(也許DOC隊得到了他們的電線交叉說它在2003年是新的)。是的,它可能導致線程飢餓,我們已經看到很多。如果你需要FIFO,你需要一個互斥鎖。

互斥鎖是內核對象,因此獲取它們比ring 3樂觀臨界區更昂貴。但是,FIFO並不是你可以(或者應該)必須忽略的那些東西,因爲它不是必需的,它不需要與線程的「層次結構」(不管是什麼 - 這是否意味着優先級?)有關。 。相同優先級的1000個線程觸發單個鎖定將很容易導致飢餓。

+0

感謝您的洞察力。我不能評論關鍵部分是先進先出法,但我一直認爲他們是,而且如果他不確定(呃......誰知道),那麼文檔作者肯定不會寫出關於這個'變化'的整段文字。我絕對關心這個問題,這就是我寫這篇文章的原因;)。我知道事情會變得多麼容易。 – 2017-04-14 09:01:37

1

這是我第一次聽到這個,當我想到它時,它似乎不是一個問題。

如果我理解正確的話::

OldWay:

Thread A acquired the CritSec 
Thread B waiting for the CritSec , tried to acquire it at time t 
Thread C waiting for the CritSec , tried to acquire it at time t + dt 

When Thread A releases the CritSec, OS ensures that Thread B acquires it. 

NEWWAY:

Thread A acquired the CritSec 
Thread B waiting for the CritSec , tried to acquire it at time t 
Thread C waiting for the CritSec , tried to acquire it at time t + dt 

When Thread A releases the CritSec, OS may choose any Thread to acquire it. So, it may be Thread B or C that will acquire it after A releases it. 

我從來不認爲(不認爲任何人假設)的線程等待CritSec將按照他們想要獲得它的順序獲得它。

可能出現這種情況對於一些廓/調試器的問題或者一些性能監控機制,使得這一假設...

+0

你真的無法想象這是許多人所做的假設嗎?說實話,我可以。也就是說,這種假設的影響是有問題的,並且只會在高負荷下應用。 – 2012-01-27 18:47:55

+0

再次想到,我幾乎總是使用相同類型的工作線程來平衡多CPU核心上的工作負載。如果某人有一個分層線程(不是同一類型或同一角色)池,也許這種FIFO行爲是需要/期望的... – Malkocoglu 2012-02-07 11:45:54

+0

無論你是否正確,它似乎都是一個靜音點。很少依賴於關鍵部分的順序,這只是在某些情況下需要注意的事情,特別是如果你有某種級聯的關鍵部分排列起來,我猜(儘管我當然不會)。在這種奇怪而罕見的情況下,FIFO假設的失敗可能會導致死鎖......至少如果我在想直的話;) – 2012-03-15 03:52:20