并发读取会导致开销吗?

Posted

技术标签:

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

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

【问题讨论】:

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

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

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

【讨论】:

以上是关于并发读取会导致开销吗?的主要内容,如果未能解决你的问题,请参考以下文章

这种方法会导致并发问题吗?

RabbitMQ:忽略 prefetch() 会导致数据并发吗?

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题

并发控制

内存中的 SQLite 数据库可以并发扩展吗?

并发编程模型小结