这种对compare_exchange的使用会产生定义的行为吗?
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来执行上述操作?
发布于 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 ",那么文档会稍微精确一些,但这会更详细。(较短的“地址”也是不明确的,因为它可能被理解为指指针本身所在的地址。)
https://stackoverflow.com/questions/67682854
复制相似问题