Я пытаюсь реализовать тестирование и тестирование и установить его в стабильном, безопасном Rust с использованием стандартной атомики.
Конечная цель - создать очередь LIFO без блокировки, используя рекурсивно определенные узлы, и я пытаюсь просто обновите queue_head
, чтобы позволить потокам поместить свои ComplexNode
в начало очереди.
use std::sync::atomic::{AtomicPtr, Ordering};
use std::ptr;
struct ComplexNode {
next: Option<Box<ComplexNode>>,
item: i32,
}
impl ComplexNode {
fn new(val: i32) -> ComplexNode {
ComplexNode {
next: None,
item: val,
}
}
}
struct ComplexQueue {
queue_head: AtomicPtr<Box<ComplexNode>>,
}
impl ComplexQueue {
fn new() -> ComplexQueue {
ComplexQueue {
queue_head: AtomicPtr::new(ptr::null_mut()),
}
}
fn ttas(&self, incoming: *mut Box<ComplexNode>) {
loop {
let curr_head = self.queue_head.load(Ordering::Relaxed);
unsafe {
if curr_head.is_null() {
Box::from_raw(incoming).next = None;
} else {
Box::from_raw(incoming).next = Some(*Box::from_raw(curr_head));
}
}
if self.queue_head.compare_exchange(curr_head, incoming, Ordering::Relaxed, Ordering::Relaxed).is_ok() {
break;
}
}
}
}
fn main() {}
Единственный способ получить компиляцию ttas
до - это используя небезопасный код. Мне интересно, можно ли достичь той же цели без небезопасного блока.
Для справки, из-за дополнительной активности в моей программе я не могу передать ссылку на ComplexNode
в ttas
.