在任务中使用必须独特的每线程第3方对象的做法是什么? (我需要确保当任务真正并行时,它们每个都会获得不同的,并且重新创建并因此重用对象的成本很高。)
我是否应该根据最大并行度的数量将对象预先初始化为某些并发集合,并使任务在开始时“借用”对象,然后在最后“返回”对象?我应该使用ThreadLocal吗?什么是最好的无争用方式?
由于
编辑:我发现我所寻找的内容大致是Parallel For calls的“localInit”func参数
答案 0 :(得分:2)
将每线程对象分配给任务?
分配每个线程必须唯一的第3方对象以在任务中使用的做法是什么?
.NET中没有概念作为"每线程" 对象,这不是COM。与COM不同,.NET对象没有线程编组。
我是否应该根据最大并行度的数量将对象预先初始化为某些并发集合
不,那很贵。通常,您只需分配您的对象并将其传递给Parallel.ForEach
(或PLINQ' s ForAll
)并让它在枚举您的集合时计算出线程数。在线程分配方面,TPL相当聪明。
什么是最好的无争用方式?
一种方法是避免在对象上放置显式锁,而是将代码设计为有些无状态,在函数调用期间返回一些值,可以在PLINQ语句中使用,也可以添加为ConcurrentBag
在执行Parallel.ForEach
期间。