首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在指向结构的指针上使用AtomicPtr::compare_exchange的行为是什么?

在指向结构的指针上使用AtomicPtr::compare_exchange的行为是什么?
EN

Stack Overflow用户
提问于 2021-05-25 06:37:24
回答 1查看 473关注 0票数 0

这种对compare_exchange的使用会产生定义的行为吗?

代码语言:javascript
复制
use std::sync::atomic::{AtomicPtr, Ordering};

struct Dummy {
    foo: i64,
    bar: i64,
}

fn main() {
    let ptr = &mut Dummy { foo: 1, bar: 2 };
    let some_ptr = AtomicPtr::new(ptr);

    let other_ptr = &mut Dummy { foo: 10, bar: 10 };

    let value = some_ptr.compare_exchange(ptr, other_ptr, Ordering::SeqCst, Ordering::Relaxed);
}

如果它被定义了,那么定义的行为是什么?Rust是否会在支持的架构(如x86_64 )上使用双宽度CAS来执行上述操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 07:51:45

这种对compare_exchange的使用会产生定义的行为吗?

除非编译器或标准库中存在bug,否则安全锈蚀永远不会导致C和C++意义上的未定义行为。此外,创建和操作指针总是安全的,它只是取消引用或将它们转换为需要显式unsafe的引用,因为程序员需要提供编译器无法验证的保证。当然,对安全函数的特定调用是否能达到预期的效果则是另一回事。

如果定义了它,那么定义的行为是什么?

这种行为是由文档指定的:将some_ptr指向的地址与ptr指向的地址进行比较,如果它们匹配,则对some_ptr进行原子更新以指向other_ptr提供的地址。在这两种情况下,都会返回前面的指针。因为您的代码从some_ptr中初始化了ptr,并且没有创建一个可以更改它的线程,所以它将导致some_ptr指向other_ptr提供的地址,并返回ptr

是否会在支持的架构(如x86_64 )上使用双宽度CAS来执行上述操作?

AtomicPtr::compare_exchange()只对指针进行比较和交换,指针的宽度与usize (现代硬件上的64位)一样宽,因此没有理由使用双宽度CAS。

但我想我理解这种混乱是如何产生的:compare_exchange的文档表示指针的价值。这个“值”不是指向数据的值,它只是底层的*mut T指针,它只代表一个内存地址。就像AtomicBool的值是bool一样,AtomicPtr值是指针。

如果文档中提到的是"address points to“而不是"value of ",那么文档会稍微精确一些,但这会更详细。(较短的“地址”也是不明确的,因为它可能被理解为指指针本身所在的地址。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67682854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档