我的应用程序中使用以下代码已有多年,但从未发现其中出现问题。
while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
lock (PendingOrders)
{
if (PendingOrders.Count > 0)
{
fbo = PendingOrders.Dequeue();
}
else
{
fbo = null;
}
}
// Do Some Work if fbo is != null
}
其中 CommandEventArr 由 NewOrderEvent(自动重置事件)和 ExitEvent(手动重置事件)组成。
但我不确定这是否是线程安全的(假设 N 个生产者线程在排队之前全部锁定队列,并且一个消费者线程运行上面的代码)。另外,我们可以假设 Queue.Count 属性仅从 Queue 类返回一个实例 Int32 值(没有 volatile 或互锁或锁等)。
与队列和 AutoResetEvent 一起使用的常用模式是什么来解决此问题并执行我尝试使用上面的代码执行的操作?
(在正确指出 Queue.Count 可以做任何事情及其特定于其实现之后,进行编辑以稍微更改问题)。
对我来说看起来相当线程安全,WaitAny() 将立即完成,因为事件已经设置。那是not一个问题。
不要破坏有效的线程同步。但如果你想要一个更好的捕鼠器,那么你可以考虑 Joe Duffy 的 BlockingQueue杂志文章 http://msdn.microsoft.com/en-us/magazine/cc163427.aspx#S4。 .NET 4.0 中有一个更通用的版本,System.Collections.Concurrent.BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspxConcurrentQueue 作为它的实际实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)