4 个版本
使用旧的 Rust 2015
0.2.1 | 2021 年 9 月 19 日 |
---|---|
0.2.0 |
|
0.1.2 | 2016 年 11 月 4 日 |
0.1.1 | 2016 年 9 月 3 日 |
0.1.0 | 2016 年 9 月 2 日 |
#111 in #order
329 每月下载量
用于 2 crates
18KB
161 代码行数(不含注释)
AtomicRef
支持静态分配的原子可选引用。
有关更多信息,请参阅文档。
lib.rs
:
原子引用
这些类型与 std::sync::atomic 中的 Atomic 类型作用相似,只不过它们包含的是一个 Option<&'a T>
值。
与其他可选值类似,这些类型提供了一些操作,当正确使用时,可以同步线程之间的更新。此类型是一种内部可变性形式,类似于 Cell<T>
、RefCell<T>
或 Mutex<T>
。
此类型在静态位置常用于惰性全局初始化。
AtomicRef
只能包含 Sized
类型,因为未大小类型具有宽指针,无法原子地写入或读取。
排序
使用 Relaxed
内存排序加载或存储原子引用是不安全的,因为这些操作没有对引用背后的数据的写入排序。为了避免此问题,加载和存储操作实际上使用 Acquire
、Release
或 AcqRel
排序,具体取决于情况。
示例
静态日志状态
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);
}