Как реализовать тестирование и тестирование и установить в Rust - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь реализовать тестирование и тестирование и установить его в стабильном, безопасном 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...