gpt4 book ai didi

c++ - protected 成员变量的错误共享?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 25 4
gpt4 key购买 nike

考虑:

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); /* … */ }
};

如果互斥量或 protected 变量连续存储,并且在缓存时共享缓存行,这会导致某种“交叉锁定”吗?

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

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

最佳答案

你的变量似乎与你的问题无关,所以你可能想要 hardware_constructive_interference_size 而不是 hardware_destructive_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 并且您想确保它们都被加载。如果这是一个问题,您需要解释为什么要避免虚假共享。

Is it a good practice to declare the mutex right after (or before) the variable it guards to increase the chance they are on the same cache line?

那是建设性干扰。

关于c++ - protected 成员变量的错误共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39529972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com