#原子 #128位 #128位原子

nightly atomicdouble

128位原子对泛型类型

1 个不稳定版本

0.1.4 2021年10月16日
0.1.3 2021年9月6日
0.1.2 2021年8月29日
0.1.1 2021年8月28日
0.1.0 2021年8月28日

并发 中排名 592


用于 hyaline-smr

Apache-2.0/MIT 协议

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 许可证定义,您有意提交的任何贡献,均应按上述方式双重许可,不附加任何额外条款或条件。

致谢

此 crate 实际上是 Atomic<T> crate 的仅 128 位版本。Atomic<T> crate 目前不支持 128 位原子,因为 Rust 还没有支持 AtomicU128/AtomicI128。在此期间,可以使用 AtomicDouble 作为替代方案。

无运行时依赖

功能