#atomic #reference #static #order

atomic_ref

支持静态分配的 Atomic &'a T 类型

4 个版本

使用旧的 Rust 2015

0.2.1 2021 年 9 月 19 日
0.2.0 2020 年 11 月 1 日
0.1.2 2016 年 11 月 4 日
0.1.1 2016 年 9 月 3 日
0.1.0 2016 年 9 月 2 日

#111 in #order

Download history 26/week @ 2024-03-11 24/week @ 2024-03-18 25/week @ 2024-03-25 34/week @ 2024-04-01 45/week @ 2024-04-08 104/week @ 2024-04-15 19/week @ 2024-04-22 28/week @ 2024-04-29 25/week @ 2024-05-06 38/week @ 2024-05-13 102/week @ 2024-05-20 64/week @ 2024-05-27 109/week @ 2024-06-03 54/week @ 2024-06-10 85/week @ 2024-06-17 81/week @ 2024-06-24

329 每月下载量
用于 2 crates

MIT 许可证

18KB
161 代码行数(不含注释)

AtomicRef

Build Status

支持静态分配的原子可选引用。

有关更多信息,请参阅文档


lib.rs:

原子引用

这些类型与 std::sync::atomic 中的 Atomic 类型作用相似,只不过它们包含的是一个 Option<&'a T> 值。

与其他可选值类似,这些类型提供了一些操作,当正确使用时,可以同步线程之间的更新。此类型是一种内部可变性形式,类似于 Cell<T>RefCell<T>Mutex<T>

此类型在静态位置常用于惰性全局初始化。

AtomicRef 只能包含 Sized 类型,因为未大小类型具有宽指针,无法原子地写入或读取。

排序

使用 Relaxed 内存排序加载或存储原子引用是不安全的,因为这些操作没有对引用背后的数据的写入排序。为了避免此问题,加载和存储操作实际上使用 AcquireReleaseAcqRel 排序,具体取决于情况。

示例

静态日志状态

use atomic_ref::AtomicRef;
use std::sync::atomic::Ordering;
use std::io::{stdout, Write};

// Define the idea of a logger
trait Logger {
    fn log(&self, msg: &str) {}
}
struct LoggerInfo {
    logger: &'static (dyn Logger + Sync)
}

// The methods for working with our currently defined static logger
static LOGGER: AtomicRef<LoggerInfo> = AtomicRef::new(None);
fn log(msg: &str) -> bool {
    if let Some(info) = LOGGER.load(Ordering::SeqCst) {
        info.logger.log(msg);
        true
    } else {
        false
    }
}
fn set_logger(logger: Option<&'static LoggerInfo>) {
    LOGGER.store(logger, Ordering::SeqCst);
}

// Defining the standard out example logger
struct StdoutLogger;
impl Logger for StdoutLogger {
    fn log(&self, msg: &str) {
        stdout().write(msg.as_bytes());
    }
}
static STDOUT_LOGGER: LoggerInfo = LoggerInfo { logger: &StdoutLogger };

fn main() {
    let res = log("This will fail");
    assert!(!res);
    set_logger(Some(&STDOUT_LOGGER));
    let res = log("This will succeed");
    assert!(res);
}

无运行时依赖