在 Rust 中获得 'unordered' 语义
Getting 'unordered' semantics in Rust
如何使用 LLVM 的 "unordered" 语义创建固定长度的整数列表 V
(参见 https://llvm.org/docs/Atomics.html)。
"unordered" 语义意味着如果您读取线程中的一个位置,您将获得以前写入的值(不一定是最新的值,因为允许优化器重新排列/缓存数组中的值).这可以看作是读取和写入原始内存的 "natural" 行为,只要值仅在单个 CPU 指令中写入和读取(因此其他线程永远看不到 "half a written value") .
这对我来说很重要,这尽可能接近单线程整数数组的性能,因为写入极其罕见,我很高兴它们丢失。
rustc 通过 std::intrinsics
模块公开了相当数量的 LLVM 内在函数,这是永久不稳定的。
不过,它在 Nightly 中可用,您可以在那里找到:
有了这些,您可以使用 UnsafeCell
作为基本构建块来构建您自己的 UnorderedAtomicXXX
。
您可以按照 std
atomics 来帮助您实施。基础应该是这样的:
pub struct UnorderedAtomic(UnsafeCell<i32>);
impl UnorderedAtomic {
pub fn new() -> Self {
UnorderedAtomic(Default::default())
}
pub fn load(&self) -> i32 {
unsafe { atomic_load_unordered(self.0.get()) }
}
pub fn store(&self, i: i32) {
unsafe { atomic_store_unordered(self.0.get(), i) }
}
unsafe fn raw(&self) -> *mut i32 { self.0.get() }
}
不清楚你是否可以得到无序的 compare/exchange 或 fetch/add。
如何使用 LLVM 的 "unordered" 语义创建固定长度的整数列表 V
(参见 https://llvm.org/docs/Atomics.html)。
"unordered" 语义意味着如果您读取线程中的一个位置,您将获得以前写入的值(不一定是最新的值,因为允许优化器重新排列/缓存数组中的值).这可以看作是读取和写入原始内存的 "natural" 行为,只要值仅在单个 CPU 指令中写入和读取(因此其他线程永远看不到 "half a written value") .
这对我来说很重要,这尽可能接近单线程整数数组的性能,因为写入极其罕见,我很高兴它们丢失。
rustc 通过 std::intrinsics
模块公开了相当数量的 LLVM 内在函数,这是永久不稳定的。
不过,它在 Nightly 中可用,您可以在那里找到:
有了这些,您可以使用 UnsafeCell
作为基本构建块来构建您自己的 UnorderedAtomicXXX
。
您可以按照 std
atomics 来帮助您实施。基础应该是这样的:
pub struct UnorderedAtomic(UnsafeCell<i32>);
impl UnorderedAtomic {
pub fn new() -> Self {
UnorderedAtomic(Default::default())
}
pub fn load(&self) -> i32 {
unsafe { atomic_load_unordered(self.0.get()) }
}
pub fn store(&self, i: i32) {
unsafe { atomic_store_unordered(self.0.get(), i) }
}
unsafe fn raw(&self) -> *mut i32 { self.0.get() }
}
不清楚你是否可以得到无序的 compare/exchange 或 fetch/add。