1 个不稳定版本
0.1.4 | 2021年10月16日 |
---|---|
0.1.3 |
|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
在 并发 中排名 592
用于 hyaline-smr
21KB
393 行代码(不包括注释)
AtomicDouble<T>
A Rust 库,为支持的架构上的泛型类型提供 128 位原子操作(目前仅支持 x86_64 和 cmpxchg16b)。当原子操作无法支持时,已提供回退实现,使用自旋锁。
您可以使用 AtomicDouble::<T>::is_lock_free()
函数来检查是否支持给定类型的原生原子操作。请注意,该库专为 128 位操作定制,违反大小限制的类型将使用回退实现。回退实现默认启用,可以通过将 default-features = false
添加到依赖声明中来禁用。
此 crate 需要 nightly。
使用方法
将其添加到您的 Cargo.toml
[dependencies]
atomicdouble = "0.1.4"
示例
use std::ptr::NonNull;
use atomicdouble::AtomicDouble;
use atomicdouble::Ordering::SeqCst;
#[derive(Copy, Clone, Eq, PartialEq, Debug,Default)]
struct Node {
head_ptr : Option< NonNull<i32> >,
head_count : usize //assuming 64-bit machine
}
fn main() {
let x = Box::new(5);
let temp_node_x = Node {
head_ptr:NonNull::new(Box::into_raw(x)),
head_count:3
};
let a:AtomicDouble::<Node> = AtomicDouble::new(temp_node_x);
println!("{}",AtomicDouble::<Node>::is_lock_free());
let load_test = a.load(SeqCst);
unsafe {
let load_test_x = Box::from_raw(load_test.head_ptr.unwrap().as_ptr());
println!("{}",*load_test_x);
println!("{}",load_test.head_count);
};
}
许可证
根据您的选择,许可如下:
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义,您有意提交的任何贡献,均应按上述方式双重许可,不附加任何额外条款或条件。
致谢
此 crate 实际上是 Atomic<T>
crate 的仅 128 位版本。Atomic<T>
crate 目前不支持 128 位原子,因为 Rust 还没有支持 AtomicU128/AtomicI128。在此期间,可以使用 AtomicDouble 作为替代方案。