从多个线程写入内存区域会导致争用吗?

问题描述 投票:1回答:1

假设我从地址0到128有一个连续的内存部分,并且整齐地将它分成两半,每6字节工作6个线程,线程1获取0, 6, 12, 18...,线程2获取1, 7, 13, 19...

如果这些线程写入这些字节,它是否会导致CPU尝试在每个核心之间同步缓存,因为它们彼此是本地的?如果每个字节作为std::atomic<uint8>访问怎么办?

c++ multithreading memory optimization atomic
1个回答
3
投票

我不知道所有的CPU,因为我最熟悉英特尔64位。虽然一般来说,如果至少有一个线程写入内存,我会说YES。

这一切都与缓存行有关。在我的电脑中,缓存行是64字节(不是位),你可以通过std::hardware_destructive_interference_size检索一个数字。

通过忽略这一点,你会陷入一个名为:false sharing的陷阱。这是通过写入同一缓存行上的不相关值而使用的缓存行的无效。

您可以使用std::memory_order来防止这种情况,但是,该值是最低要求,因为CPU本身保证std :: memory_order_seq_cst,所以在Intel 64bit上大多数时候都会被忽略。它可能仍然会对优化产生影响。 (对于可以处理原子的小优化传递)

总结:尽可能给出线程区域的内存iso随机元素。

© www.soinside.com 2019 - 2024. All rights reserved.