5

考虑:

class Vector
{
  double x, y, z;
  // …
};

class Object
{
  Vector Vec1, Vec2;
  std::mutex Mtx1, Mtx2;

  void ModifyVec1() { std::lock_guard Lock(Mtx1); /* … */ }
  void ModifyVec2() { std::lock_guard Lock(Mtx2); /* … */ }
};

如果互斥锁或受保护的变量连续存储并且在缓存时它们共享一个缓存行,这会导致某种“交叉锁定”吗?

如果是这样,在它们保护的变量之后(或之前)声明互斥锁是一种好习惯吗?

将类与std::hardware_destructive_interference_size( P0154 ) 对齐可能会避免这种影响。潜在的好处值得对象的过度对齐吗?

4

1 回答 1

4

您的变量在您的问题中似乎无关,因此hardware_destructive_interference_size您可能想要的不是hardware_constructive_interference_size

struct keep_together {
    std::mutex m;
    Vector v;
};

alignas(std::hardware_constructive_interference_size) keep_together k1;
alignas(std::hardware_constructive_interference_size) keep_together k2;

destructive您想用于无锁队列之类的情况,如果线程正在读取两个不同atomic的 s 并且您想确保它们都实际被加载。如果这是一个问题,您需要解释为什么您要避免虚假共享。

在它保护的变量之后(或之前)声明互斥锁以增加它们在同一缓存行上的机会是一个好习惯吗?

那是constructive干扰。

于 2016-09-16T11:39:46.373 回答