今天阅读了几篇「无锁编程」的文章(虽然没怎么看懂,尤其是陈皓写的),
发现大伙普遍承认Atomic类型的性能比Mutex互斥锁好很多
调研了Java/C++/Rust的Atomic的库后发现
库基本上只提供Atomic的整数类型或布尔值类型
以Rust为例,想用非布尔值非整数的Atomic只能用AtomicPtr
而AtomicPtr用起来要小心,读写可能会陷入unsafe
Rust文档中的AtomicPtrExample写法不适用于static作用域
error[E0658]: references in statics may only refer to immutable values
查阅资料后找到能通过编译的写法
pub static mut WORKDAYS: AtomicPtr = AtomicPtr::new(std::ptr::null_mut());
Write:
unsafe {
*WORKDAYS.get_mut() = &mut String::from("test");
}
Read:
println!("[{}]", unsafe { &*WORKDAYS.load(atomic::Ordering::SeqCst) });
volatile 保证触发读写,跟 atomic 应该是正交的
苦于不懂计算机相关理论,只好将Atomic当RwLock用
读取用Relaxed原子序,写入时用SeqCst原子序