#缓存 #填充 #无锁 #原子

no-std cache-padded

通过填充和对齐到缓存行长度来防止伪共享

5 个稳定版本

1.3.0 2023年5月12日
1.2.0 2021年12月19日
1.1.1 2020年7月7日
1.1.0 2020年5月31日
1.0.0 2020年5月25日

#508并发

Download history 53251/week @ 2024-03-14 58350/week @ 2024-03-21 50902/week @ 2024-03-28 52119/week @ 2024-04-04 57004/week @ 2024-04-11 52184/week @ 2024-04-18 49377/week @ 2024-04-25 46178/week @ 2024-05-02 46959/week @ 2024-05-09 44692/week @ 2024-05-16 41763/week @ 2024-05-23 42799/week @ 2024-05-30 42958/week @ 2024-06-06 42044/week @ 2024-06-13 44766/week @ 2024-06-20 31873/week @ 2024-06-27

169,380 每月下载
用于 319 个 Crates(14 个直接使用)

Apache-2.0 OR MIT

11KB
71

cache-padded (已弃用)

Build License Cargo Documentation

此 crate 现已弃用,改用 crossbeam-utils::CachePadded

通过填充和对齐到缓存行长度来防止伪共享。

在并发编程中,有时需要确保常用的共享数据不会全部放置在相同的缓存行中。更新原子值会使其所属的整个缓存行失效,这使得其他 CPU 内核对该缓存行的下一次访问变慢。使用 CachePadded 来确保更新一条数据不会使其他缓存的无效化。

大小和对齐

假设缓存行长度为 N 字节,取决于架构

  • 在 x86-64、aarch64 和 powerpc64 上,N = 128。
  • 在 arm、mips、mips64 和 riscv64 上,N = 32。
  • 在 s390x 上,N = 256。
  • 在其他所有架构上,N = 64。

请注意,N 只是一个合理的猜测,并不保证与程序运行的实际缓存行长度相匹配。

CachePadded<T> 的大小是 N 字节的最小倍数,足以容纳类型 T 的值。

CachePadded<T> 的对齐是 N 字节和 T 对齐的最大值。

示例

对齐和填充

use cache_padded::CachePadded;

let array = [CachePadded::new(1i8), CachePadded::new(2i8)];
let addr1 = &*array[0] as *const i8 as usize;
let addr2 = &*array[1] as *const i8 as usize;

assert!(addr2 - addr1 >= 64);
assert_eq!(addr1 % 64, 0);
assert_eq!(addr2 % 64, 0);

当构建一个具有头和尾索引的并发队列时,将索引放置在不同的缓存行中是明智的,这样并发线程推送和弹出元素就不会使彼此的缓存行失效

use cache_padded::CachePadded;
use std::sync::atomic::AtomicUsize;

struct Queue<T> {
    head: CachePadded<AtomicUsize>,
    tail: CachePadded<AtomicUsize>,
    buffer: *mut T,
}

许可证

在以下任一许可证下授权

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应作为上述双重许可使用,不附加任何额外条款或条件。

无运行时依赖