首先,让我解释一下情况。允许只有一个线程通过/不使线程等待不必要
我有了2个属性的类:DataA的和数据B;不管它们是什么,重要的是每一个都可以从另一个中计算出来。我处于多线程环境中,并且在需要时计算DataA/DataB(如果有必要,并不总是这样)。我首先想到的是像...
public SomeDataObject DataA
{
get
{
if (dataAisAvailable)
{
return dataA;
}
else
{
if (dataBisAvailable)
{
lock (dataACalcLock)
{
// Don't want other threads recalculating dataA
if (dataAisAvailable)
{
return dataA;
}
////////////////////////////////
// Calculate dataA from dataB //
////////////////////////////////
dataAisAvailable = true;
return dataA;
}
}
else
{
return null;
}
}
}
}
有了这个模式,假设数据B确实可用,在到达现场的第一个线程(我们称之为线程1)变为计算数据A,都好到目前为止...但是,任何等待dataA被计算的线程现在都必须逐一访问它......不是非常高效的imho。我想让这些线程等待thread1来完成dataA的计算,然后所有的线程都像没有锁一样。
我对ManualResetEvents也许有过其他想法,但我不确定如何安全地确保一个线程和一个线程完成计算。
我希望我已经解释清楚,虽然我不相信我有。虽然很乐意澄清......
编辑:我的不好,我在.NET 4.0上。这是在Silverlight ...
正在计算dataA的线程将不会到达ResetEvent,因为在thread1完成计算之前dataA不可用。 – 2011-05-25 11:09:03