在多核环境中同时读取共享内存

时间:2014-08-27 07:01:11

标签: c++ mutex shared-memory multicore

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

1 个答案:

答案 0 :(得分:4)

保证只读它,并且没有其他人写到它,然后你很好。

问题出现在任何线程正在从一个变量读取而另一个线程正在写入它时,这种考虑经常出现在实践中。

出于某种原因,缓存一致性已成为一个重要主题。无论如何,如果你有一个带有指向变量的指针的线程,你编译的程序将取消引用该指针以获取变量的内存地址并从中读取。即使有2个线程访问它,高速缓存一致性也不会阻止读取工作。性能可能会受到影响,这取决于CPU如何管理缓存页面 - CPU仍然必须读取包含变量的页面,并且可能会缓存它,这里与读取全局变量或堆上分配的变量没有区别。你的C ++程序不知道缓存行,编译的机器指令不知道C ++变量。据我所知,x86中的缓存行是64字节,而写入共享变量旁边的内存地址的真实情况是CPU会更新其缓存(即将变量重新读入CPU缓存)它仍然不比使用任何其他全局变量更糟糕。

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