this
在上面的C片段中,我相信可以使用#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);
}
,因为即使没有内存屏障,编译器也不会重新安排对memory_order_relaxed
的调用和printf
的获取,在存储request->id
的值之前。
这是对的吗?我非常肯定它是,但想要绝对确定,以防有其他事情需要考虑原子。
答案 0 :(得分:2)
你只做一次原子操作,当你从它返回时,你就有了自己的价值。其他一切都是通过&#34; normal&#34;内存模型就像顺序代码一样,就像它一直以来一样。
分配结束时的;
是一个序列点。所以你的方法非常好。事实上,你在原子操作中唯一需要的是它是不可分割的,你不需要正常的#34;顺序保证。原子操作。