我正在尋找.NET Compact Framework的信號量的快速高效的實現。在SO(Semaphores in .NET compact framework)上有另一個問題,其中建議使用P/Invoke,但在XBox 360上運行的XNA Framework中不可能。在XBox 360上XNA有一個很好的信號量嗎?
我可以提供兩個我自己的實現,但我相信這兩者都不是最優的。
Semaphore using an AutoResetEvent(引擎收錄)
一種可能的實施有管理的信號量會,使用的AutoResetEvent。
在這種情況下,當工作變得可用時,AutoResetEvent將只將一個線程轉換爲'runnable'狀態。當OS線程調度程序運行線程時,它將重新打開AutoResetEvent,使下一個線程進入'可運行'狀態。所以線程將按順序啓動,並且只有在它們的前任實際執行後纔會啓動。
Semaphore using a ManualResetEvent(引擎收錄)
另一種可能的實現將被使用的ManualResetEvent。
在這種情況下,當工作變得可用時,ManualResetEvent將所有線程轉換爲'runnable'狀態。操作系統線程調度程序運行的所有線程均競爭工作項,直到第一個線程運行結束後再次重置ManualResetEvent。換句話說,即使並非所有線程都是必需的,可能所有線程都會在短時間內被喚醒。
有誰知道有更好的實施或可以提供改進我的建議嗎?
對我來說像自動重置事件是這裏的投注選項 – Martin 2009-12-08 11:05:34
等等,你有沒有在XBox上的任何PInvokes?給開發者CF但不允許PInvokes有點不公平。說實話,PInvoke通常是任何「CF」解決方案的一部分。 – Quibblesome 2009-12-08 12:08:31
不,對於安全原因,xbox上沒有pinvokes。您只能訪問任何可通過託管代碼訪問的API – 2009-12-08 21:45:20