我正在寻找.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