今天我在MSDN碰到這個傳來:臨界區的變化在Windows 2003 SP1
「與Windows Server 2003 帶有Service Pack 1(SP1)開始,線程 等待一個臨界區不 收購的臨界區 先來先服務的基礎。這 變化增加性能 顯著的大多數代碼。但是, 一些應用程序依賴於先入 先出(FIFO)順序和可 執行poo 當前版本的Windows( 示例,使用臨界區段作爲 速率限制器的 應用程序)。爲確保您的 代碼繼續正常工作,您可能需要添加 同步的其他級別。例如,假設 您有一個生產者線程和一個 消費者線程正在使用 臨界區對象來同步 他們的工作。創建兩個事件對象, 一個用於每個線程用於通知 它已準備好爲其他線程 繼續。消費者線程將 等待生產者進入臨界 部分之前的信號其 事件,生產者線程將 等待消費者線程進入臨界 部分之前的信號 它的事件。 。每個線程離開 臨界區之後,它標誌着其事件 釋放其他線程」
起初,我還以爲跆拳道? - 我一直認爲線程將收購秩序的一個關鍵部分他們試圖獲得它,雖然這似乎是一個服務包行爲奇怪的巨大變化,該服務包是針對服務器版的Windows和Vista正在開發當時我相信的時間
無論如何,所以它有點意義 - 這種方式下調度器旋轉的下一個等待線程將成爲下一個得到關鍵部分的線程,至少我假設這是唯一的因此,除非他們決定爲了好玩而做一個隨機選擇;)。
不過,這是一個我已經做出的假設,現在正在評估我的代碼,以確保沒有任何FIFO依賴的情況是一個問題。
有沒有人有任何現實世界的問題呢?雖然獲取關鍵部分的線程的順序不能保證是FIFO,但它通常不是FIFO?如果不是通常是 FIFO(或接近FIFO),有沒有人知道一個線程可以等待一個嚴重競爭的關鍵部分多長時間?如果它是低優先級的線程,這是否意味着如果始終有更高優先級的線程試圖獲取臨界區(即使低優先級線程很早之前如果遵守FIFO則下一個在線),這是否意味着它可能幾乎無限期地等待)?是否有避免這種情況的安全措施,或者是否依賴於授權的輔助同步對象?
當然,這真的只是一個真正嚴重有爭議的關鍵部分。
我不知道,也許我做得太多了......但有些事情讓我困擾。任何見解都會被讚賞。謝謝;)
感謝您的洞察力。我不能評論關鍵部分是先進先出法,但我一直認爲他們是,而且如果他不確定(呃......誰知道),那麼文檔作者肯定不會寫出關於這個'變化'的整段文字。我絕對關心這個問題,這就是我寫這篇文章的原因;)。我知道事情會變得多麼容易。 – 2017-04-14 09:01:37