3

我正在为 .NET Compact Framework 寻找快速高效的信号量实现。这里有另一个关于 SO(.NET 紧凑框架中的信号量)的问题,其中建议使用 P/Invoke,但这在 XBox 360 上运行的 XNA 框架中是不可能的。

我可以提供两种我自己的实现,但我相信两者都不是最佳的。

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

在这种情况下,当工作可用时,AutoResetEvent 将仅将一个线程转换为“可运行”状态。当 OS 线程调度程序运行线程时,它将重新打开 AutoResetEvent,使下一个线程进入“可运行”状态。所以线程将按顺序启动,并且只有在它们的前任真正开始执行之后。

使用 ManualResetEvent (pastebin)
另一种可能的实现是使用 ManualResetEvent。

在这种情况下,当工作可用时,ManualResetEvent 会将所有线程转换为“可运行”状态。OS 线程调度程序运行的所有线程都在竞争工作项,直到第一个耗尽工作的线程再次重置 ManualResetEvent。换句话说,即使不是所有线程都需要,也可能所有线程都会在短时间内被唤醒。

有谁知道那里有更好的实施方案,或者可以提供改进我的建议?

4

2 回答 2

2

编辑:没关系,只需阅读您引用的另一个线程:信号量类本身不包含在 XBox 的 CF 中吗?
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

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

于 2009-12-09T17:14:05.743 回答
0

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

于 2010-02-24T20:07:54.890 回答