我正在寻找能够编译成神奇的cmpxchg
指令的东西。挖到后
文档,我找不到任何可以为Cell
完成此任务的内容。
也许这是反模式?
在深入研究代码后,我在Cell
的实现中添加了以下内容,以确定它是否可行。
pub fn cmp_and_set(&self, old: T, new: T) -> T {
unsafe {
::intrinsics::atomic_cxchg(self.value.get(), old, new)
}
}
// ^ there are many many reasons why this is not so great
// this is just an example of what I'm looking for
简单用法
fn main() {
let c0 = Cell::new(10);
let val0 = c0.cmp_and_set(11, 5);
assert_eq!(c0.get(), 5);
let val1 = c0.cmp_and_set(10, 42);
assert_eq!(c0.get(), 42);
}
据我所知,对于非常基本的情况,它可以工作,但是有很多原因可以解释为什么特定的实现不是很好。 我编辑标准库以获得我想要的东西的事实意味着我当然试图实现某种反模式。
这是通过重新阅读The Rust Programming Language
中的以下内容而提示的使用此包装器仍然可能违反您自己的不变量,因此使用它时要小心。如果一个字段包含在
Cell
中,那么这是一个很好的指示,表明数据块是可变的,并且在您第一次读取它和打算使用它之间可能不会保持不变。
答案 0 :(得分:4)
TL; DR:不,没有,因为没必要。
比较和设置仅在两个(或更多)参与者并行修改对象时有价值。
虽然Cell
允许内部可变性,但它不是线程安全的,因此您将永远不会处于两个actor将尝试并行修改它的情况。
因此,如果适合您,您可以使用get()
,比较和set()
。并且没有人会更改get()
和set()
之间的值,前提是您不要自己调用其他代码。