可以使用gcc提供的内置函数__atomic_load_n()来原子地一次性读取多个变量的值。该函数使用了GCC内置的原子操作,可以保证在不被中断的情况下完成读取。
以下是一个示例代码,读取三个整数变量a、b和c的值:
#include <stdio.h> #include <stdatomic.h> int main(void) { int a = 1, b = 2, c = 3; int abc[3]; __atomic_load_n(&a, &abc[0], __ATOMIC_SEQ_CST); __atomic_load_n(&b, &abc[1], __ATOMIC_SEQ_CST); __atomic_load_n(&c, &abc[2], __ATOMIC_SEQ_CST); printf("a = %d, b = %d, c = %d\n", abc[0], abc[1], abc[2]); return 0; }
在上面的示例中,先定义一个整数数组abc,用来存放a、b和c的值。然后使用__atomic_load_n()函数,将a、b和c的值一次性读取到数组abc中。
__atomic_load_n()函数接受三个参数:第一个参数是要读取的变量的地址,第二个参数是指向存储读取结果的变量的指针,第三个参数是内存序(Memory Order),常用的内存序有三种:__ATOMIC_RELAXED、__ATOMIC_ACQUIRE和__ATOMIC_SEQ_CST。在这个例子中,使用的是最强的内存序__ATOMIC_SEQ_CST,可以保证最终结果的正确性。
内存模型
因为编译器的优化,实际代码执行顺序不一定是你写的顺序。
1. 比如对于a的修改,内存模型应该使用release。保证在这个操作之前的memory accesses不会重排到这个操作之后去,这样就不会向消费者提前释放可用信号。
__atomic_store_n(&a, true, __ATOMIC_RELEASE);
2 .对于a的读取,内存模型应该使用acquire。保证在这个操作之后的memory accesses不会重排到这个操作之前去,这样就不会提前读到生产者还未写完的数据。
__atomic_load_n(&a, __ATOMIC_ACQUIRE);
3 .对b的修改,调用atomic_compare_exchange_n函数,最后两个参数应该都是ATOMIC_RELAXED,即内存模式使用relaxed,即没有约束。因为b只是多个操作者之间用来做类似互斥的竞争
标签:__,load,abc,ATOMIC,内存,atomic From: https://www.cnblogs.com/dream397/p/17763965.html