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

时间:2019-02-28 07:32:08

标签: c++ multithreading memory optimization atomic

假设我有一个从地址0到128的连续内存部分,并且将它整齐地平分,以便每个第六个字节工作6个线程,线程1得到0, 6, 12, 18...,线程2得到1, 7, 13, 19...,等等

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

1 个答案:

答案 0 :(得分:3)

我不了解所有CPU,因为我最熟悉Intel 64位。虽然一般来说,如果至少有一个线程正在写入内存,我会说是。

这与缓存行有关。在我的PC中,缓存行是64字节(不是位),您可以通过std::hardware_destructive_interference_size来检索该数字。

无视这一点,您陷入了一个陷阱:错误共享。这是您写入同一高速缓存行上无关值的高速缓存行无效。

您可以使用std::memory_order来防止这种情况,但是,该值是最低要求,由于CPU本身保证了std :: memory_order_seq_cst,因此在大多数情况下,在Intel 64bit上,该值会被忽略。它可能仍然对优化有影响。 (对于可以处理原子的小优化过程)

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