25 个版本
0.6.1 | 2024 年 6 月 6 日 |
---|---|
0.5.4 | 2024 年 4 月 26 日 |
0.5.2 | 2024 年 3 月 22 日 |
0.5.1 | 2023 年 6 月 24 日 |
0.2.0 | 2016 年 11 月 4 日 |
#69 在 Rust 模式 中
81,002 每月下载量
用于 97 个 crate(26 个直接使用)
57KB
800 行
volatile
为原始指针提供易失性包装类型。
此 crate 中的易失性包装类型封装了任何可复制的类型的指针,并提供对封装值的易失性内存访问。易失性内存访问永远不会被编译器优化掉,并且在许多底层系统编程和并发环境中非常有用。
此 crate 提供了两种不同的包装类型:VolatilePtr
和 VolatileRef
。这两种类型之间的区别在于前者表现得像一个原始指针,而后者表现得像一个 Rust 引用类型。例如,VolatilePtr
可以自由复制,但不能跨线程发送,因为这可能会引入可变别名。另一方面,VolatileRef
类型需要独占访问才能进行修改,因此跨线程边界共享它是安全的。
这两种包装类型 不 强制执行任何原子性保证;要获得原子性,请考虑查看 libcore
或 libstd
中找到的 Atomic
包装类型。
为什么没有 VolatileCell?
许多人表达了对VolatileCell
类型的兴趣,即一种透明包装类型,拥有被包装的值。这种类型类似于core::cell::Cell
,区别在于所有方法都是易变的。不幸的是,在Rust中实现这样的VolatileCell
类型并不可行。原因是Rust和LLVM都将&
和&mut
引用视为可解引用的。这意味着编译器可以不受任何限制地自由访问引用的值。因此,无论如何实现VolatileCell
类型,编译器都可以执行对包含值的非易变读操作,这可能导致意外的(甚至未定义的?)行为。更多详情请见我们仓库中的讨论[链接]和在unsafe-code-guidelines仓库中的讨论。
许可证
许可协议为以下之一:
- Apache License, Version 2.0 (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT或http://opensource.org/licenses/MIT)
您可以选择其中之一。
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均将按照上述方式双重许可,不附加任何额外条款或条件。
依赖项
~115KB