faa_array_queue 0.1.2

Fetch-And-Add Array Queue implementation for Rust.
Documentation
use crate::FaaArrayQueue;

#[test]
pub fn test_hazard_vector() {
    use std::sync::Arc;
    use std::thread;

    let thread_count = 128;
    let loop_count = 53;
    let queue1 = Arc::new(FaaArrayQueue::<usize>::default());
    let queue2 = Arc::new(FaaArrayQueue::<usize>::default());

    let handles: Vec<_> = (0..thread_count)
        .into_iter()
        .map(|idx| {
            let cpy1 = queue1.clone();
            let cpy2 = queue2.clone();
            thread::spawn(move || {
                thread::park();
                let start = idx * loop_count;
                for idx in start..start + loop_count {
                    cpy1.enqueue(idx);
                }
                for _ in 0..loop_count {
                    let val;
                    loop {
                        if let Some(x) = cpy1.dequeue() {
                            val = x;
                            break;
                        }
                    }
                    cpy2.enqueue(val);
                }
            })
        })
        .collect();

    for child in handles.iter() {
        child.thread().unpark();
    }

    for child in handles.into_iter() {
        child.join().unwrap();
    }

    let none = queue1.dequeue();
    assert!(none.is_none(), "expected vec1 to be empty");
    let mut vec2 = Vec::new();
    loop {
        if let Some(x) = queue2.dequeue() {
            vec2.push(x);
        } else {
            break;
        }
    }

    vec2.sort();

    for i in 0..(thread_count * loop_count) {
        assert!(vec2[i] == i, "unexpected vec2 value");
    }
}