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 在 并发
169,380 每月下载
用于 319 个 Crates(14 个直接使用)
11KB
71 行
cache-padded (已弃用)
此 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 License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应作为上述双重许可使用,不附加任何额外条款或条件。