2026/5/21 14:38:58
网站建设
项目流程
个人主页网站应该怎样做,国外idc网站,网站优化排名价格,园林绿化东莞网站建设在 C 中#xff0c;内存序#xff08;Memory Order#xff09;是多线程编程中原子操作的重要概念#xff0c;它用于控制原子操作的内存同步行为。C11 引入了 atomic 头文件#xff0c;提供了内存序来控制多线程环境下的内存访问顺序。内存序的作用内存序主要解决两…在 C 中内存序Memory Order是多线程编程中原子操作的重要概念它用于控制原子操作的内存同步行为。C11 引入了atomic头文件提供了内存序来控制多线程环境下的内存访问顺序。内存序的作用内存序主要解决两个问题可见性一个线程对共享数据的修改何时对其他线程可见顺序性操作指令的执行顺序如何被其他线程观察六种内存序1.memory_order_relaxed最宽松的顺序约束只保证原子性不保证顺序。cppstd::atomicint x(0); x.store(1, std::memory_order_relaxed); // 不保证其他线程立即看到这个值2.memory_order_consume依赖于该原子操作的后续操作不会被重排序到该操作之前依赖关系。cppstd::atomicint* ptr; int data; // 线程1 data 42; ptr.store(data, std::memory_order_consume); // 线程2 int* p ptr.load(std::memory_order_consume); if (p ! nullptr) { // 保证能看到 data 42 int val *p; }3.memory_order_acquire用于读操作保证该操作之后的所有读写不会被重排序到该操作之前。cppstd::atomicbool flag(false); int data 0; // 线程1 data 42; flag.store(true, std::memory_order_release); // 线程2 while (!flag.load(std::memory_order_acquire)); // 这里保证能看到 data 424.memory_order_release用于写操作保证该操作之前的所有读写不会被重排序到该操作之后。cpp// 与上面 acquire 配合使用5.memory_order_acq_rel同时包含 acquire 和 release 语义用于读-修改-写操作。cppstd::atomicint counter(0); counter.fetch_add(1, std::memory_order_acq_rel);6.memory_order_seq_cst最严格的顺序约束默认保证所有线程看到相同的操作顺序。cppstd::atomicint x(0); x.store(1); // 默认使用 memory_order_seq_cst典型使用模式1.Release-Acquire 同步cppstd::atomicbool ready(false); int data 0; // 线程1生产者 data 42; ready.store(true, std::memory_order_release); // 线程2消费者 while (!ready.load(std::memory_order_acquire)); // 这里保证能看到 data 422.Release-Consume 同步cppstd::atomicint* ptr(nullptr); int value; // 线程1 value 100; ptr.store(value, std::memory_order_release); // 线程2 int* p ptr.load(std::memory_order_consume); if (p ! nullptr) { // 保证能看到 p 指向的数据 int v *p; // v 100 }3.自旋锁实现cppclass SpinLock { std::atomic_flag flag ATOMIC_FLAG_INIT; public: void lock() { while (flag.test_and_set(std::memory_order_acquire)); } void unlock() { flag.clear(std::memory_order_release); } };性能考虑relaxed性能最好但需要谨慎使用seq_cst性能最差但最容易理解acquire/release在性能和正确性之间取得平衡实用建议优先使用默认的 seq_cst除非有性能瓶颈理解 happens-before 关系后再使用宽松内存序测试多线程代码内存序错误很难调试使用现成的同步原语如 mutex, condition_variable通常更安全示例无锁计数器cpp#include atomic #include thread #include iostream class Counter { std::atomicint count{0}; public: void increment() { count.fetch_add(1, std::memory_order_relaxed); } int get() const { return count.load(std::memory_order_acquire); } }; int main() { Counter counter; std::thread t1([]() { for (int i 0; i 1000000; i) { counter.increment(); } }); std::thread t2([]() { for (int i 0; i 1000000; i) { counter.increment(); } }); t1.join(); t2.join(); std::cout Count: counter.get() std::endl; return 0; }