foreach
循环与闭包的线程安全
在使用foreach
循环和闭包时,确保线程安全需要仔细考虑。您描述的场景中,有两个代码片段在处理闭包中对Foo对象的引用方式上有所不同。
第一个片段直接传递引用:
<code class="language-c#">foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }</code>
这种方法不安全,因为相同的f
引用被所有线程共享。这意味着不同的线程可能会访问和修改同一个Foo对象,导致不可预测的行为。
为了确保线程安全,您应该在循环内创建引用的副本,如第二个片段所示:
<code class="language-c#">foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }</code>
通过在循环内创建一个新的f2
变量,每个线程都拥有自己对Foo对象的引用副本。这确保了每个线程都在操作唯一对象,防止竞争条件和潜在的数据损坏。
注意: 此问题并非与线程处理特有的。当在异步操作或事件处理程序中使用闭包时,同样的问题也会出现,为了避免意外行为并维护数据完整性,需要特别注意。
以上是foreach 循环与闭包一起使用时是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!