【问题标题】:Thread Safety for Parallel Tasks in .NET.NET 中并行任务的线程安全
【发布时间】:2012-05-04 22:10:54
【问题描述】:

任务并行库的委托的内部线程是否安全 - 即在该委托中声明的变量的值是否与该线程隔离?

例子:

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

something 是否保证对于线程始终是唯一的,防止被同一 Parallel 操作创建的另一个线程覆盖?

【问题讨论】:

  • 如下所述,这个例子是线程安全的。但在使用 TPL 时,情况并非总是/自动发生。确保任务是独立的或线程安全的仍然是程序员的主要责任。没有编译器警告,没有工具。

标签: c# .net multithreading thread-safety task-parallel-library


【解决方案1】:

因为这是一个委托,something 是一个局部变量,如果它是一个 值类型,它肯定是线程安全的 - 当然,如果变量包含一个 ,它仍然可以被覆盖对共享引用对象的引用(例如,对委托用作闭包的变量的引用)

【讨论】:

  • 所以如果 collection 有 10 个项目,并且 TPL 产生 10 个线程,那么所有 10 个线程可能都在处理对 something 的相同引用?
  • 仅当集合中有 10 个相同的引用时。据推测,该集合的每个条目都有唯一的对象。如果集合多次添加相同的对象,那么您可能有“某物”引用内存中的相同对象。
  • @lukiffer:如果您的示例确实是您在委托中所做的,那么不,每个线程都将持有对新 Something 对象的单独引用
  • 最近当我在大量数据上使用带有 BackgroundWorker 和 Timer 的 Parallel 库时,这让我很不爽。本质上,BackgroundWorker 和 Timer 允许多个实例启动,但每个工作人员最终都在同一个集合上工作。丑陋的比赛条件。愚蠢的错误。
  • @ChrisSinclair - 关于collection 中的重复项很好,但在任何情况下读取属性通常都是线程安全的。
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多