2016-04-21 116 views
2
#include <stdatomic.h> 

void request_number(request_t *request) 
{ 
    static atomic_int counter; 

    request->id = atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed); 

    printf("Request assigned ID %u\n" request->id); 
} 

计数器在上述C段,我认为这是确定使用memory_order_relaxed,因为即使没有内存围栏编译器不会调用重新安排printfrequest->id取的前门店值为request->id创建具有atomic_fetch_add_explicit

这是正确的吗?我相当肯定它是如此,但是如果还有其他的东西需要考虑到原子的话,我想要绝对确定。

回答

2

你正在做只有一个原子操作,当你从它返回时,你有你的价值。其他的一切都是用“正常”的内存模型来完成的,就像它一直以来一样,它将用于顺序代码。

;在作业结束时是一个序列点。所以你的方法非常好。事实上,在这里你唯一需要从原子操作中得到的东西是它是不可分割的,你不需要“正常”原子操作的顺序保证。