我剛剛開始瞭解一些新的.NET併發集合,如ConcurrentDictionary和ConcurrentQueue,我正在運行一些測試以查看當我寫入並行隊列時會發生什麼。隊列<T>併發給不同的結果不同的類型
於是我就這樣:
private static void ParallelWriteToQueue(Queue<int> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1,1000001,(i) => queue.Enqueue(i));
sw.Stop();
Console.WriteLine("Regular int Queue - " + queue.Count + " time" + sw.ElapsedMilliseconds);
}
而且因爲我認爲我得到了一個異常:
Source array was not long enough. Check srcIndex and length, and the array's lower bounds.
所以當預測到這一隊列無法處理的併發連接隊列。
但,當我改變了隊列字符串類型,沒有例外,並將結果寫入類似
Regular string Queue - 663209 time117
這意味着只有約663k被入隊。
爲什麼沒有例外?
所有未入場的物品發生了什麼變化?
這是隊列
private static void ParallelWriteToQueue(Queue<string> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1, 100001, (i) => queue.Enqueue(i.ToString()));
sw.Stop();
Console.WriteLine("Regular string Queue - " + queue.Count + " time" + +sw.ElapsedMilliseconds);
}
您只運行第二個並行for循環到100001而不是1000001. – 2012-08-16 06:24:10
@DanielHilgarth對不起,我在複製之前更改了它...它運行的迭代次數相同 – Mithir 2012-08-16 06:34:24
未定義的行爲未定義。有時你遇到了錯誤,有時候你不會。 – CodesInChaos 2012-08-16 06:37:03