2012-05-04 55 views
3

任務並行庫線程委託的內部是否安全 - 即該委託中聲明的變量的值是否與該線程分離?.NET中並行任務的線程安全

例子:

Parallel.ForEach(collection, item => { 
    var something = new Something(item.Property); 
}); 

something保證始終是唯一的線索,對由同一Parallel操作創建另一個線程被覆蓋保護?

+1

如下面詳細描述的,這個例子是線程安全的。但使用TPL時,情況並非總是如此。確保任務是獨立的或其他線程安全的仍然是程序員的主要責任。沒有編譯器警告,沒有工具。 –

回答

5

由於這是一個代表something是一個局部變量和肯定線程安全,如果它是一個值類型的 - 當然如果變量持有參考到共享參考對象(它仍然可以被覆蓋例如對代理用作閉包的變量的引用)

+0

因此,如果'collection'有10個項目,並且TPL產生了10個線程,那麼所有10個線程都可能處理與'something'相同的引用? – lukiffer

+5

只有在集合中有10個相同的引用。據推測,收集將有每個條目獨特的對象。如果集合多次添加了相同的對象,那麼您可能會在內存中引用同一個對象。 –

+3

@lukiffer:如果你的例子實際上是你在委託中做的事情,那麼不,每個線程都會單獨引用一個新的'Something'對象 – BrokenGlass