Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个特定的Parallel.For()循环是线程安全的吗?_C#_Multithreading_Parallel Processing_Thread Safety_Critical Section - Fatal编程技术网

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

C# 这个特定的Parallel.For()循环是线程安全的吗?,c#,multithreading,parallel-processing,thread-safety,critical-section,C#,Multithreading,Parallel Processing,Thread Safety,Critical Section,我确信只有使用Parallel.For通过集合读取才被认为是线程安全的 编辑:未通过代码的其他部分访问数组 这个特殊的Parallel.For()loop线程安全吗 根据someStringArray类型的实现,只要在枚举时不修改集合本身即可 在您的示例中,任何时候都不会有两个线程修改集合中的同一元素 一般来说,集合不被认为是线程安全的,因为如果您从一个线程读取一个项目,而另一个线程添加一个条目,并导致集合在读取操作的中间调整大小(以及要复制的项目),则它们的内部逻辑可能会失败。p> 但是,对于

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

编辑:未通过代码的其他部分访问数组

这个特殊的
Parallel.For()
loop线程安全吗

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

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

一般来说,集合不被认为是线程安全的,因为如果您从一个线程读取一个项目,而另一个线程添加一个条目,并导致集合在读取操作的中间调整大小(以及要复制的项目),则它们的内部逻辑可能会失败。p>
但是,对于固定大小的数组,这种情况不应该发生<代码>列表
在引擎盖下使用了一个数组,但这是一个实现细节,在一般情况下你不应该真正依赖它。

@marcGravel如果集合足够大,这是一个很好的奖励,是的。可能吧,但我们不知道是否还有其他东西在同时访问该数组。。。为什么不干脆
var someNewArray=someStringArray.aspallel().Select(s=>s.Trim()).ToArray()
?@spender沿着LINQ表达式的道路走下去,会有更多的事情发生。我编辑了我的问题,谢谢!那么我要说“安全”。如果这是在数组运行时访问数组的唯一代码,那么“因为你没有修改集合本身”就可以了——当我用新元素编辑集合中已经存在的元素时,它不是在修改吗?@SpiritBob:嗯,这取决于实现。什么是
someStringArray
?它是一个数组,或者确切地说是
像这样定义的东西[]
@SpiritBob:那么你就安全了。你看到我的更新了吗?它应该能回答你的问题。
Parallel.For(0, someStringArray.Count, (i) =>
{
    someStringArray[i] = someStringArray[i].Trim();
});