首頁 >後端開發 >C++ >foreach 迴圈與閉包一起使用時是線程安全的嗎?

foreach 迴圈與閉包一起使用時是線程安全的嗎?

DDD
DDD原創
2025-01-22 07:01:08268瀏覽

Is foreach Loop Thread-Safe When Used with Closures?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn