【问题标题】:Concurrent reading of shared memory in multi-core environment多核环境下并发读取共享内存
【发布时间】:2014-08-27 07:01:11
【问题描述】:

假设两个线程在不同的核心上运行,每个线程都有一个指向共享变量的相同指针的副本,如果两个线程都保证只读取这个变量,这是否会引发任何问题?我没有使用任何类型的互斥锁...

【问题讨论】:

  • 只读就可以了
  • 这取决于您所说的“问题”。由于cache coherence,您可能会看到一些性能影响。
  • 使用互斥锁可能只是更好的做法...您可以获得一个共享读取器互斥锁,它可能是无操作的,也可能会保存您的培根。以后维护和扩展其他一些 shmuck 也会更容易。

标签: c++ mutex shared-memory multicore


【解决方案1】:

保证只读取它,没有其他人写入它,那么你很好。

当任何线程正在读取变量而其他线程正在写入时,就会出现问题,这种考虑在实践中经常发生。

由于某种原因,缓存一致性已经成为一个大话题。无论如何,如果您有一个线程具有指向变量的指针,您编译的程序将取消引用该指针以获取变量的内存地址并从中读取。缓存一致性不会阻止读取工作,即使有 2 个线程访问它。性能可能会受到影响,具体取决于 CPU 管理缓存页面的方式 - CPU 仍然必须读取包含变量的页面,并且可能会缓存它,这与读取全局变量或在堆上分配的变量没有区别。您的 C++ 程序不知道缓存行,编译的机器指令不知道 C++ 变量。据我了解,x86 中的缓存行是 64 字节,虽然写入共享变量旁边的内存地址确实会导致 CPU 更新其缓存(即将变量重新读入 CPU 缓存)它仍然不比使用任何其他全局变量差。

如果你不断地读取这个变量,并且担心性能,最好在每个线程中获取一个本地副本。如果没有人会更新周围的 64 字节内存,那么就没有意义了。如果您担心,您将需要衡量任何性能影响。

【讨论】:

  • * 如果没有其他人写入同一缓存行。 CPU 不跟踪单个变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2016-12-08
  • 2021-10-15
  • 2011-11-03
相关资源
最近更新 更多