【问题标题】:Delphi read-only generics like TDictionary<T> and TList<T> are thread safe?像 TDictionary<T> 和 TList<T> 这样的 Delphi 只读泛型是线程安全的吗?
【发布时间】:2017-08-12 17:14:10
【问题描述】:

我可以仅在单元初始化时在通用列表或字典中添加项目,然后将其用作多个线程的只读吗?

我在一个主题中读到TList&lt;T&gt; 是线程安全的,而在另一个主题中TDictionary&lt;T&gt; 不是。两者有什么区别?

【问题讨论】:

  • 你看过这个问题吗? stackoverflow.com/questions/27517063/…
  • 非常感谢您的回复。我看到是的,但是我的问题是,如果我在某个单元的“初始化”中初始化字典项并将其仅用于在多个线程中读取是安全的。

标签: multithreading delphi tlist tdictionary


【解决方案1】:

阅读是安全的,写作不是。只要您可以确保在任何线程访问它之前填充TList/TDictionary,并且您只是检索项目,而不是添加/修改项目,那么它是安全的。但是,最好不要依赖这种行为。在跨线程同步访问共享资源时应始终明确,例如TCriticalSectionTMutexTMREWSync(或 Win32 SRW 锁)、TMonitor 等。

【讨论】:

  • 如果性能很重要,那么您希望避免锁定。所以最好依赖只读线程安全。
  • @David,并不是说它们中的任何一个都是线程安全的,仅供阅读。这是内部实现。您可以阅读源代码并说它是。但是有一天 EMBT 改变了实现,你会感到惊讶。
  • @Victoria 这很公平。但是在多线程性能敏感的环境中,要避免使用锁,因此如果您不能信任这些类,那么您可以实现自己的。
  • @David,我已经这样做了。线程不安全的那些正在使用高效的锁(slim RW 或 CS,如果有的话,他们会知道 :) 这很容易,如果你允许它们“自动学习”(这是在编译时,如果在运行时允许的话),它们'正在检查线程在做什么。如果到目前为止所有这些都只是读取并且只有一个尝试写入,则使用纤细的 RW 锁。如果有多个线程尝试写入,我将锁升级到 CS。
  • @Victoria 在这种只读方案中,这将比未受保护的集合执行得更差。
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多