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中文網其他相關文章!