我需要檢查一個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