【问题标题】:Object is only read by multiple threads, does it needs synchronization对象只能被多线程读取,是否需要同步
【发布时间】:2013-12-11 10:22:51
【问题描述】:

我拥有的集合对象是单例类型,它包含一个特定对象的列表,列表中的每个索引由多个线程读取,以便它们可以查询一个线程局部变量要使用的整数属性值.在我看来,这种情况是否需要使用同步的任何安全性?不,但发布问题是为了加倍确定。

上面提到的对象在多个线程上没有发生更新,它们只是在读取。在我看来,甚至不需要在这里使用 ReaderWriterLockSlim,因为没有写入。请确认我的理解。

代码类似于:

这里的 NumOfLocs,threadProp 是特定于一个线程和集合计数和对象不会改变,而线程正在读取,它们只是在初始化期间在开始时固定

int NumOfLocs = collectionObject.LocCollection.Count;

int threadProp = collectionObject.LocCollection[index].Prop

【问题讨论】:

  • 如果你只是阅读(如果你不会在阅读时更改它)那么不需要
  • 那么你要做的就是在你的程序加载时创建一次这个数据,然后从这个数据结构中读取?
  • LocCollection 是什么类型? FCL 集合(位于 System.CollectionsSystem.Collections.Generic)对于读取是线程安全的。

标签: c# .net multithreading


【解决方案1】:

如果您只是阅读集合,则不需要同步。但是,如果您想更新集合,可以使用 System.Collections.Concurrent 中可用的线程安全集合类列表。 See here 获取 MSDN 文档。

【讨论】:

  • 这不是真的,因为 每个 集合都可以实现。当然,这应该是正确的。
【解决方案2】:

通常用于读取状态的函数不会改变状态。但有时某些对象的某些功能会改变某些内部对象的状态,这与常识相反。例如,如果对象正在缓存某些内容或重新排列内部结构,则可能会发生这种情况。在不了解对象的内部工作原理的情况下,不可能预先说明某个对象在其任何功能中的作用。

如果它是标准的 .NET 对象,那么可能有它的文档会告诉您该对象是否是线程安全的以供读取。如果是第三方对象,那么您必须询问该第三方。如果您对对象进行了编码,那么只有您自己知道。

【讨论】:

  • 请解释反对意见。我认为答案没有错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多