2026/2/10 14:14:51
网站建设
项目流程
网站建设实践报告3000字,行业网站运营,网站规划内容包括,网页表格代码C++ 多线程编程:原子操作、无锁编程与性能优化 1. 原子操作与内存顺序 在单线程的 C++ 程序中,不会出现数据竞争的风险,我们可以在不考虑指令重排的情况下编写程序。但在多线程程序中,涉及共享变量时情况就完全不同了。编译器和硬件的优化是基于单线程的观察结果进行的,…C++ 多线程编程:原子操作、无锁编程与性能优化1. 原子操作与内存顺序在单线程的 C++ 程序中,不会出现数据竞争的风险,我们可以在不考虑指令重排的情况下编写程序。但在多线程程序中,涉及共享变量时情况就完全不同了。编译器和硬件的优化是基于单线程的观察结果进行的,它无法知晓其他线程通过共享变量能观察到什么,因此程序员需要告知编译器哪些重排是允许的。使用原子变量或互斥锁来避免数据竞争,就是在做这样的事情。当使用互斥锁保护临界区时,只有持有锁的线程才能执行临界区代码。同时,互斥锁会在临界区周围创建内存屏障,告知系统在临界区边界某些重排是不允许的。获取锁时会添加获取屏障,释放锁时会添加释放屏障。例如,假设有四条指令 i1、i2、i3 和 i4,它们相互独立,系统可以任意重排这些指令而不产生可观察的影响。其中 i2 和 i3 使用了共享数据,需要用互斥锁保护。添加互斥锁的获取和释放操作后,某些重排就不再有效了。临界区的指令不能移出临界区,否则将失去互斥锁的保护。i1 指令可以穿过获取屏障进入临界区,但不能越过释放屏障;i4 指令可以穿过释放屏障进入临界区,但不能越过获取屏障。graph LR classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px; A(i1):::process -- B(获取锁):::process B -- C(i2):::process C -- D(i3):::process D -- E(释放锁):::process E