【问题标题】:Value storage during Parallel Processing并行处理期间的值存储
【发布时间】:2012-12-14 06:55:14
【问题描述】:

我只是尝试了这个简单的程序...没什么花哨的..

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);
});

根据这个代码,100000 个数字必须分别存储在 a、b、a1、b1 中。但有时,变量 b1(由并行进程更新的列表)的数字少于 100000(保持在 90000 和 100000 之间变化)。我想知道为什么...

【问题讨论】:

  • 尝试使用线程安全的 ConcurrentBag

标签: c# parallel-processing task-parallel-library


【解决方案1】:

List&lt;T&gt; 对于同时写入的多个线程不是线程安全的,如MSDN page 中所述。您必须同步访问(违背多线程的目的)或使用线程安全的集合。 System.Collections.Concurrent 命名空间中有可用的线程安全集合。

【讨论】:

  • lock (lockobject){b1.Add(i);} 应该修复它吗?当然,正如你所说,它打败了平行点。
  • @NoviceProgrammer 是的,但是正如 mike 提到的,在这个特定的示例中,在添加之前锁定会破坏多线程的目的:您仍然一次只向列表添加一个元素。
  • @NoviceProgrammer 是的,这是一种典型的同步方式,如果每个线程都在做更多的工作,这样锁的竞争就很少了。
  • 像 ConcurrentBag 这样的新类型在下面做同样的事情吗?
  • 做了一个快速检查,在这个相当不切实际的例子中使用 ConcurrentBag 比使用锁要慢很多
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多