2010-10-18 116 views
0

我無法在Win32 Apis中找到任何獲取螺旋鎖的函數。
是否有原因?如何最好地同步在內核和用戶空間之間共享的內存訪問,在Windows中

當我需要使用螺旋鎖時,我該怎麼辦?

我知道有一個CriticalSectionAndSpinCount函數。
但這不是我想要的。

編輯:
我想同步將在內核空間和用戶空間之間共享的內存。 - 內存將被映射。
當我訪問數據結構時,我應該鎖定它,鎖定時間會很短。
數據結構(假設它是一個隊列)管理事件句柄以相互交互。
我應該使用什麼同步機制?

+0

「Ke」表示它是內核模式API;這個API無疑被用戶模式同步API使用。您試圖完成CriticalSection API沒有提供的具體內容是什麼? – EricLaw 2010-10-18 13:51:05

+1

你能解釋你爲什麼命名的Win32 API不是你想要的嗎? – 2010-10-18 13:52:56

+0

因爲如果功能耗盡了所有給定的自旋計數,功能將會休眠。 – Benjamin 2010-10-18 14:22:13

回答

4

螺旋鎖顯然不適合用戶級同步。從http://www.microsoft.com/whdc/driver/kernel/locks.mspx

所有類型的自旋鎖的提高IRQL 到DISPATCH_LEVEL或更高。自旋 鎖是唯一可以在IRQL> = DISPATCH_LEVEL上使用的同步機制。代碼保持旋轉 鎖運行在IRQL> = DISPATCH_LEVEL, 這意味着系統的線程 切換代碼(調度程序)不能 運行,因此,當前線程 不能被搶佔。

想象一下,如果可以在用戶模式下進行自旋鎖定:突然間線程將無法被搶佔。因此,在單CPU機器上,現在這是一個獨立的實時線程。用戶模式代碼現在將負責處理中斷和其他內核級別的任務。代碼不能訪問任何分頁的內存,這意味着用戶模式代碼需要知道當前分頁的內存並相應地執行。貓和狗住在一起,羣衆歇斯底里!

也許更好的問題是告訴我們你想要完成什麼,並詢問哪種同步方法最合適。

+0

感謝飛利浦。我編輯了我的問題。 – Benjamin 2010-10-18 14:33:56

0

有一個受管用戶模式SpinLockas described here。按照文檔中的建議小心處理 - 使用這些鎖很容易出錯。

在本機代碼中訪問此的唯一方法是通過您已經命名的Win32 API - CriticalSectionAndSpinCount及其兄弟姐妹。

相關問題