XBox 360上有没有适合XNA的信号量?

时间:2009-12-07 13:24:33

标签: compact-framework synchronization multithreading xna semaphore

我正在寻找一种快速有效的.NET Compact Framework信号量实现方法。在SO(Semaphores in .NET compact framework)上有另一个问题,其中建议使用P / Invoke,但这在XBox 360上运行的XNA Framework中是不可能的。

我可以提供我自己的两个实现,但我相信两者都是次优的。

Semaphore using an AutoResetEvent (pastebin)
托管信号量的一种可能实现方式是使用AutoResetEvent。

在这种情况下,当工作可用时,AutoResetEvent只会将一个线程转换为“可运行”状态。当OS线程调度程序运行该线程时,它将重新打开AutoResetEvent,使下一个线程进入'runnable'状态。因此线程将按顺序启动,并且只有在它们的前任实际执行后才会启动。

Semaphore using a ManualResetEvent (pastebin)
另一种可能的实现方式是使用ManualResetEvent。

在这种情况下,当工作可用时,ManualResetEvent会将所有线程转换为“runnable”状态。操作系统线程调度程序运行的所有线程都会争用工作项,直到第一个用完工作的线程再次重置ManualResetEvent。换句话说,即使并非所有线程都是必需的,也可能短时间唤醒所有线程。

有没有人知道更好的实施或者可以提供改进我的建议?

2 个答案:

答案 0 :(得分:2)

编辑:没关系,只需读取您引用的其他线程: Semaphore类本身是否未包含在XBox的CF中? http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

否则,这是我在codeproject上找到的实现。没有自己使用它,但也许它可以作为参考:-)
http://www.codeproject.com/KB/threads/inprocsemaphore.aspx

答案 1 :(得分:0)

OpenNetCF对于紧凑框架有一个Semaphore class。你有什么理由不能在Xbox上使用OpenNetCF库吗?