C# 并行处理期间的值存储

C# 并行处理期间的值存储,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,我刚刚试过这个简单的程序。。。没什么特别的 double[] a = new double[100000]; double[] b = new double[100000]; List<double> a1 = new List<double>(); List<double> b1 = new List<double>(); for (Int64 i = 0; i < 100000; i++) { a[i] = i; a1

我刚刚试过这个简单的程序。。。没什么特别的

double[] a = new double[100000];
double[] b = new double[100000];

List<double> a1 = new List<double>();
List<double> b1 = new List<double>();

for (Int64 i = 0; i < 100000; i++)
{
    a[i] = i;
    a1.Add(i);
}

Parallel.For(0, 100000, delegate(Int64 i)
{
    b[i] = i;
    b1.Add(i);
});
double[]a=新的double[100000];
double[]b=新的double[100000];
列表a1=新列表();
列表b1=新列表();
对于(Int64 i=0;i<100000;i++)
{
a[i]=i;
a1.加入(i);
}
并行。用于(0,100000,委托(Int64 i)
{
b[i]=i;
b1.加入(i);
});
根据该代码,100000个数字必须分别存储在a、b、a1、b1中。但有时,变量b1(由并行过程更新的列表)的数字少于100000(保持在90000到100000之间变化)。我想知道为什么


列表
对于同时写入多个线程来说不是线程安全的,如上所述。您必须同步访问(违背多线程的目的)或使用线程安全集合。
System.collections.Concurrent
命名空间中有线程安全集合可用。

lock(lockobject){b1.Add(i);}应该修复它吗?。当然,正如你所说的,它打破了程序员的平行点,是的,但是正如mike提到的,在这个特定的例子中,添加前锁定会破坏多个线程的功能:您仍然一次只向列表中添加一个元素。@是的,这是一种典型的同步方式,如果每个线程都在做更大量的工作,这样就不会对锁产生争用,这是非常好的。较新的类型是否像ConcurrentBag在下面做同样的事情吗?做了一个快速检查,在这个相当不现实的示例中使用ConcurrentBag比使用锁要慢很多,尝试使用线程安全的ConcurrentBag。