使用AtomicPtr::compare_exchange在指向结构体的指针上执行原子操作需要在比较和交换中指定用于比较的函数和用于交换的函数。
比较函数应该接受两个指向结构体的const指针和一个指向void的指针参数,然后将其转换为指向AtomicPtr实例化的结构体类型的指针,并返回一个bool值,以指示比较的结果。
交换函数应该接受两个指向结构体的指针和一个指向void的指针参数,并通过将交换值复制到指向原子指针的指针中来更改指针的值。
以下是一个使用AtomicPtr::compare_exchange在指向结构体的指针上执行原子操作的示例:
use std::sync::atomic::{AtomicPtr, Ordering};
struct Data {
value: i32,
next: Option>,
}
extern "C" fn compare_ptrs(a: *const Data, b: *const Data, _: *mut ()) -> bool {
a == b
}
extern "C" fn exchange_ptrs(old: *mut Data, new: *mut Data, _: *mut ()) -> *mut Data {
let prev = unsafe { (*old).next.take() };
unsafe { (*new).next = prev };
old
}
fn main() {
let head = Box::new(Data {
value: 1,
next: None,
});
let head_ptr = AtomicPtr::new(Box::leak(head) as *mut Data);
let new_head = Box::new(Data {
value: 0,
next: Some(head),
});
let new_ptr = Box::into_raw(new_head);
let res = head_ptr.compare_exchange(
Box::leak(head) as *const Data,
new_ptr,
Ordering::AcqRel,
Ordering::Acquire,
);
assert!(res.is_ok());
// verify new head
let gen_head = unsafe { &