虚假共享受保护的成员变量?

时间:2016-09-16 11:06:25

标签: c++ c++11 mutex c++17 false-sharing

考虑:

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_sizeP0154)对齐可能会避免这种影响。潜在的好处值得对象的对齐吗?

1 个答案:

答案 0 :(得分:3)

您的变量似乎与您的问题无关,所以而不是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,你想确保它们实际上都被加载了。如果这是一个问题,你需要解释为什么错误分享是你正在避免的。

  

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

那是constructive干扰。