【问题标题】:Is this particular Parallel.For() loop thread-safe?这个特定的 Parallel.For() 循环是线程安全的吗?
【发布时间】:2020-05-02 08:50:30
【问题描述】:
Parallel.For(0, someStringArray.Count, (i) =>
{
    someStringArray[i] = someStringArray[i].Trim();
});

我确信只有通过 Parallel.For 的集合读取才被认为是线程安全的。

编辑:没有通过其他代码部分访问该数组。

【问题讨论】:

  • @MarcGravell 如果集合足够大,这是一个很好的奖励,是的。
  • 可能,但我们不知道是否还有其他东西同时访问该数组...为什么不只是var someNewArray = someStringArray.AsParallel().Select(s => s.Trim()).ToArray()
  • @spender 当您沿着 LINQ 表达式的道路前进时,还有很多事情要做。我编辑了我的问题,谢谢!
  • 那我会说“安全”。
  • 如果这是在运行时访问数组的唯一代码,那很好

标签: c# multithreading parallel-processing thread-safety critical-section


【解决方案1】:

这个特定的Parallel.For() 循环线程安全吗?

根据someStringArray 类型的实现,只要您在枚举时不修改集合本身即可。

在您的示例中,任何时候都不会有两个线程修改集合中的同一元素。

一般来说,集合不被认为是线程安全的,因为它们的内部逻辑可能会失败,例如,如果您从一个线程读取一个项目,而另一个线程添加一个项目并导致集合在读操作的中间。

这不应该发生在固定大小的数组中。 List<T> 在底层使用了一个数组,但这是一个实现细节,在一般情况下您不应该真正依赖它。

【讨论】:

  • 因为你没有修改集合本身” - 当我用新元素编辑集合中已经存在的元素时,它不是在修改吗?
  • @SpiritBob:嗯,这取决于实现。 someStringArray 是什么?
  • 这是一个数组,或者更准确地说是somethingDefinedLikeThis[]
  • @SpiritBob:那你就安全了。你看到我的更新了吗?它应该回答你的问题。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多