保护成员变量的错误共享
False sharing of guarded member variables?
考虑:
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(对齐可以避免这种影响。对象的过度对齐是否值得潜在的好处?
您的问题中的变量似乎不相关,因此您可能想要的不是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;
如果线程正在读取两个不同的atomic
,并且您希望确保它们都被实际加载,那么您希望将destructive
用于无锁队列之类的情况。如果这是一个问题,你需要解释为什么你要避免虚假分享。
在互斥锁保护的变量之后(或之前(声明互斥锁,以增加它们在同一缓存线上的机会,这是一种好的做法吗?
这是constructive
干扰。
相关文章:
- 加载共享库时C++错误:libopencv_ximgproc.so.4.4
- 共享内存:MapViewOfFile 返回错误 5
- 为 Python 构建共享库C++时出现分段错误
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 共享指针取消引用错误
- 避免错误共享以提高性能
- 在共享内存中插入映射映射时出现编译器错误
- OpenMP 环路阵列访问中的错误共享
- OpenMP并行区域中的std::vector push_back会导致错误共享吗
- Eigen & OpenMP : 由于错误共享和线程开销,没有并行化
- 多线程效率低下:调试错误共享
- boost::detail::spinlock_pool中的错误共享
- 错误共享和原子变量
- 缓存行、错误共享和对齐
- CUDA错误:共享数据太多(0x4018字节,最大0x4000):额外的0x18字节从哪里来
- C++中的错误共享
- c++使用' .reserve() '填充' std::vector '作为防止多线程缓存无效和错误共享的一种方
- 保护成员变量的错误共享