我正在为 .NET Compact Framework 寻找快速高效的信号量实现。这里有另一个关于 SO(.NET 紧凑框架中的信号量)的问题,其中建议使用 P/Invoke,但这在 XBox 360 上运行的 XNA 框架中是不可能的。
我可以提供两种我自己的实现,但我相信两者都不是最佳的。
使用 AutoResetEvent (pastebin)
的信号量 托管信号量的一种可能实现是使用 AutoResetEvent。
在这种情况下,当工作可用时,AutoResetEvent 将仅将一个线程转换为“可运行”状态。当 OS 线程调度程序运行线程时,它将重新打开 AutoResetEvent,使下一个线程进入“可运行”状态。所以线程将按顺序启动,并且只有在它们的前任真正开始执行之后。
使用 ManualResetEvent (pastebin)
另一种可能的实现是使用 ManualResetEvent。
在这种情况下,当工作可用时,ManualResetEvent 会将所有线程转换为“可运行”状态。OS 线程调度程序运行的所有线程都在竞争工作项,直到第一个耗尽工作的线程再次重置 ManualResetEvent。换句话说,即使不是所有线程都需要,也可能所有线程都会在短时间内被唤醒。
有谁知道那里有更好的实施方案,或者可以提供改进我的建议?