我需要检查一个Parallel.ForEach
的任何迭代是否达到特定点。从我的理解下面将是安全的,如果我的bool
是volatile
领域,但它需要在外层方法的变量:从C#中的多个线程安全地写入一个bool变量?
bool anySuccess = false;
Parallel.ForEach(things, thing =>
{
// stuff happens...
anySuccess = true;
});
if(!anySuccess)
throw new Exception("No things succeeded :(");
我可以使用此代码按原样或我应该使用lock
或Interlocked
功能?
如果为'anySuccess只写'是将它设置为真,并且直到处理完成之后才会读取它,那么你可能会逃避它。但我会建议使用锁。 – stuartd
您也可以最后使用Volatile.Read(!anySuccess)检查。 – Evk
在这种特定情况下,AnySuccess上可能发生的唯一操作是将其设置为true。这意味着不同线程之间不会有任何竞争条件,例如一个线程将anySuccess设置为false,另一个线程同时将其设置为true。所以在这里你甚至不需要锁定或并行的foreach;即使你在同一时刻开启所有线程,也没有什么不好的事情发生。 – Nebr