低价网站建设机构,专业团队张伟图片,网站做强制解析,上海市工程建设监理协会网站原子操作#xff08;atomic operations#xff09;是多线程实现的基石#xff0c;互斥锁#xff08;mutex#xff09;和条件变量#xff08;condition variable#xff09;都是通过原子操作来实现#xff1b;std::sync::atomic包括了rust的内置原子操作类型#xff08…原子操作atomic operations是多线程实现的基石互斥锁mutex和条件变量condition variable都是通过原子操作来实现std::sync::atomic包括了rust的内置原子操作类型如AtomicI32, AtomicUsize等大部分依赖于硬件架构和操作系统来实现几乎所有的平台platform都提供了至少在指针pointer级别的原子类型每个原子操作都有一个参数std::sync::atomic::Ordering决定了我们想要这些原子操作内部进行的相对顺序最宽松的顺序是Relaxed在线程A里先对变量X做了写操作然后迅速对变量Y做写操作在Relaxed的顺序下某线程B可能看到的顺序是先改变Y再改变Xload(self, ordering: Ordering), store(self)的第一个参数表示是一个共享引用shared referenceT而不是互斥引用exclusive referencemut T但是仍然可以改变T的值Fetch-and-Modify操作把获取-更改作为一个原子操作返回更改前的值同时要注意fetch_add() 和 fetch_sub()实现了溢出行为wrapping behaviour具体实现详见Page37Page38给出了一个经典的move语义的编译器检查问题for t in 0..4中t的生命周期与后面spawn的线程的生命周期的冲突问题注意atomic类型没有实现Copy特征但是实现了Sync表示它的共享引用T可以在多线程中传递Page41给出了一个生成唯一ID的用例如何确保每次生成的ID唯一并且不溢出第一个方案是当ID超过某个数字时使之Panic通过assert或者std::process::abort停掉该进程第二个方案是同时用fetch_sub来减少ID的数值第三个方案使用了compare-and-exchange操作这里第一个方案正好是标准库中Arc::clone()用来处理borrow个数的方法第二个方案是thread::scope用来处理一个scope中同时有多少个线程的ID的方法compare_exchange(self, expected:i32, new:i32, success_order: Ordering, failure_order:: Ordering)的签名比较复杂但是可以用来实现所有其他的原子操作Page43给了一个用compare_exchange来实现fetch_add的实例当ABA problem出现的时候使用compare_exchange_weak()会更加有效及时当前的值与expected相等也有可能返回Err这种情况是为了应对可能出现的欺骗性compare-and-exchange也就是ABA问题在load完成后的很短时间内修改atomic的值后又修改回来企图欺骗编译原值并没有变化但实际上进行过变化fetch_update()方法等同于load()之后使用一个loop计算更新值然后调用compare_exchange_weak来确保update的正确性使用方法见Page45Page46给出了一个情景使用compare_exchange()比使用compare_exchnage_weak()更高效使用std::sync::Once和std::sync::OnceLock可以解决单例中generate_random_key()耗时过长但又不想重复调用的场景确保某个静态变量只会初始化一次