use crossbeam_utils::atomic::AtomicCell;
let a = AtomicCell::new(7);
assert_eq!(a.load(), 7);
assert_eq!(a.swap(8), 7);
assert_eq!(a.load(), 8);
a.store(9);
assert_eq!(a.load(), 9);
use crossbeam_utils::sync::ShardedLock;
let lock = ShardedLock::new(5);
// 讀的鎖可以同時獲取
{
let r1 = lock.read().unwrap();
let r2 = lock.read().unwrap();
assert_eq!(*r1, 5);
assert_eq!(*r2, 5);
}
// 寫的鎖只能有一個
{
let mut w = lock.write().unwrap();
*w += 1;
assert_eq!(*w, 6);
}
use crossbeam_utils::sync::WaitGroup;
use std::thread;
// 創建新的等待組
let wg = WaitGroup::new();
for _ in 0..4 {
// 創建等待組的引用
let wg = wg.clone();
thread::spawn(move || {
// 實際邏輯
// 解除對等待組的引用
drop(wg);
});
}
// 會阻塞直到所有線程完成工作
wg.wait();
let array = [1, 2, 3];
let mut guards = vec![];
for i in &array {
let guard = std::thread::spawn(move || {
println!("element: {}", i);
});
guards.push(guard);
}
for guard in guards {
guard.join().unwrap();
}
let array = [1, 2, 3];
crossbeam::scope(|scope| {
for i in &array {
scope.spawn(move || {
println!("element: {}", i);
});
}
});
use crossbeam_queue::{ArrayQueue, PushError};
let q = ArrayQueue::new(2); // 指定容量為2
assert_eq!(q.push('a'), Ok(()));
assert_eq!(q.push('b'), Ok(()));
assert_eq!(q.push('c'), Err(PushError('c')));
assert_eq!(q.pop(), Ok('a'));
use crossbeam_queue::{PopError, SegQueue};
let q = SegQueue::new();
q.push('a');
q.push('b');
assert_eq!(q.pop(), Ok('a'));
assert_eq!(q.pop(), Ok('b'));
assert_eq!(q.pop(), Err(PopError));