两个线程(生产者和消费者)之间的经典同步习惯涉及
生产者更新共享内存中的值(global_variable
),然后使用发布语义更新原子标记(flag
)。在C11中,生产者代码可以写成如下:
global_variable = 0;
atomic_store_explicit(&flag, 1, memory_order_release); // flag is an integer
消费者等待flag
的值变为1,然后阅读global_variable
。如果使用GCC原子库编写了消费者,它将如下所示:
while (__atomic_load_n(&flag, __ATOMIC_ACQUIRE) != 1; // loop until flag enabled
// read value of global_variable
如果消费者代码是使用显式C11原子加载编写的,我们希望程序是正确的...但是GCC"等效"代码保证也可以工作?换句话说,问题变成:在不同库中定义的原子操作是否兼容? GCC atomics documentation对这方面含糊不清:
以下内置函数大致符合C ++ 11内存模型的要求