如果一个数据结构被多个线程读取(问:也写?),如果线程正在访问不同的缓存行,则不会出现“线程抖动”。
在这方面有经验的人能否分享一些代码/建议,他们如何确保/确定缓存行的开始/结束位置?对于 vector 数组之类的东西,这相对容易,但是对于 std::unordered_map
或 std::set
呢?
在这种数据结构中,您如何强制不同线程访问的数据位于不同的缓存行?
一个想法是将每个数据结构项“填充”到至少缓存行的长度,但这肯定会浪费缓存空间吗?
如果可以证明上述方法始终有效,那么这种技术是否是一种“无锁”甚至可能是“无等待”数据结构?
最佳答案
一个集合的节点在内存中随机分布,因此不太可能共享缓存行。但是,由于您在写入之前将整个集合锁定在内存中,因此无论如何都没有抖动的风险。
关于c++ - 编写数据结构以对每个线程使用不同的缓存行以避免线程抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281847/