我有此代碼意外的結果使用互鎖
int j = -1;
Parallel.For(0, 100, i =>
{
Console.Write("i= " +i);
Interlocked.Increment(ref j);
Console.Write(" j= " + j);
Console.WriteLine();
});
它運行後,我期待具有i
值某種程度上隨機顯示,而不是在升序排列,但對於j
可變我的值希望一直按升序排列。
所以現在我有這個輸出在某個時刻:
因此,有一個價值觀93
和94
之間j= 78
,這是正確的?請問你們有些人可以解釋爲什麼我在這裏有這個值,而不是77
和79
之間,這是因爲Console.Write方法不是線程安全的嗎?
是否j
變量的值給出升序(我期待),輸出j = 78
只是一個小故障Console.Write
方法,因爲它不是線程安全的?
打印時,您的代碼中未使用任何鎖。你真正的問題是什麼? – Nayuki
你應該真的使用/打印'Interlocked _return value_'。Increment',以獲得真正的原子增量,因爲'j'可以在您使用它時由另一個線程更改,而返回值在返回後不會更改。 –
@JoachimIsaksson這樣做意味着每個值只能打印一次,沒有任何重複或跳過的數字,但不能保證它們按順序打印。 – Servy