有没有办法 "check and set" `std::cell::Cell` 的值?

Is there a way to "check and set" the value of a `std::cell::Cell`?

我一直在寻找可以编译成神奇的 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

中的以下内容的提示

It is still possible to violate your own invariants using this wrapper, so be careful when using it. If a field is wrapped in Cell, it's a nice indicator that the chunk of data is mutable and may not stay the same between the time you first read it and when you intend to use it.

TL;DR: 不,没有,因为没有必要。


比较和设置仅在两个参与者(或更多)并行修改对象时才有价值。

虽然 Cell 允许内部可变性,但它不是线程安全的,因此您永远不会遇到两个参与者试图并行修改它的情况。

因此,您可以只使用get()、比较和set(),如果它适合您。如果您不自己调用其他代码,则没有人会更改 get()set() 之间的值。