考虑:
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)对齐可能会避免这种影响。潜在的好处值得对象的对齐吗?
答案 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
干扰。