【问题标题】:Does concurrent read cause overhead?并发读取会导致开销吗?
【发布时间】:2021-11-30 14:02:33
【问题描述】:

假设在 C# 多线程编程中,我们有一个全局的共享类对象O。多个线程可以同时读取O 的各种只读字段(即不写,只读)。这会带来额外的开销,还是预期读取性能与单线程读取一样快?

【问题讨论】:

  • 它是technically possible,在给定的场景中你必须非常不幸。一定要测量。
  • @HansPassant 我的知识共享开销只发生在写入,而不是读取,否则我会注意到它。你知道发生这种情况的任何架构吗?
  • 您正在忽略另一种类型的静态变量,这些变量在内存中相邻,仍在同一缓存行中,并且被写入。您无法直接控制存储地址,因此不必担心它。仅当您测量到知道您遇到问题时才考虑填充。
  • 但即使缓存行中有其他内容,读取仍然不会产生开销。只有写作会导致虚假分享问题。

标签: c# multithreading


【解决方案1】:

简单的读取不会有任何开销。

可能需要强制执行内存排序的读取。 volatile 字段或 Volatile.Read 的使用可能会在特定的单个操作方面产生开销,而且还会阻止对周围代码的一些优化,因为它具有获取语义。

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2012-05-18
    • 2017-02-28
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2023-03-28
    相关资源
    最近更新 更多