Xbox 360上有适用于XNA的好的信号量吗?

3
我正在寻找.NET Compact Framework的Semaphore的快速高效实现。这里曾经有一个关于SO的问题(Semaphores in .NET compact framework),其中建议使用P/Invoke,但在运行XBox 360上的XNA Framework中不可能实现。
我可以提供两种自己的实现,但我认为它们都不够优秀。 使用AutoResetEvent的Semaphore(pastebin)
一种可能的托管Semaphore的实现方式是使用AutoResetEvent。
在这种情况下,当工作可用时,AutoResetEvent只会将一个线程转换为“可运行”状态。当操作系统线程调度程序运行线程时,它将重新打开AutoResetEvent,将下一个线程带入“可运行”状态。因此,线程将按顺序启动,并且仅在其前任实际执行后才启动。

使用ManualResetEvent的信号量 (pastebin)
另一种可能的实现方法是使用ManualResetEvent。

在这种情况下,当有任务可用时,ManualResetEvent将使所有线程进入“可运行”状态。操作系统线程调度器运行的所有线程都竞争工作项,直到第一个运行完工作的线程再次重置ManualResetEvent。换句话说,即使不需要所有线程,可能所有线程都会被唤醒短暂的时间。

是否有人知道更好的实现方法或者可以提供改进建议?


听起来对我来说,自动重置事件是最好的选择。 - Martin
等等,你在XBox上有任何PInvoke吗?给开发人员提供CF但不允许PInvoke有点不公平。说实话,PInvoke通常是任何“CF”解决方案的一部分。 - Quibblesome
不,出于安全原因,在Xbox上没有pinvoke。您只能通过托管代码访问可访问的任何API。 - Joel Martinez
@Martin:如果信号量用于阻止很少争用的资源,则AutoResetEvent是不错的选择。但如果您将其用于实现线程池,其中可能会一次添加十几个任务以并行化工作,那么它会变得相当缓慢,因为线程将一个接一个地获取任务。 - Cygon
2个回答

2

感谢提供 CodeProject 的链接!虽然该文章中的代码比一场 F1 赛车还要有更多的竞争条件,但是使用数组和 WaitHandle.WaitAny() 为我提供了一些新的想法 :) - Cygon
如果你的实现能够工作,那么将其发布出来会很棒 :-) - Joel Martinez

0

他在谈论XNA,这其实是一个受限制的沙盒,其中包含了一些CF的东西。不幸的是,由于XNA对直接API调用/P/Invoke施加的限制,SDF无法在XNA上工作。 - ctacke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接