#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
是可以的,因为即使没有内存栅栏,编译器也不会在存储 printf
的值之前重新安排对 request->id
的调用和 request->id
的获取。这样对吗?我相当肯定它是,但我想绝对确定,以防还有其他需要考虑原子的事情。
最佳答案
你只做一个原子操作,当你从它返回时,你就有了你的值(value)。其他一切都是使用“正常”内存模型完成的,就像顺序代码一样,就像往常一样。
赋值末尾的 ;
是一个序列点。所以你的方法非常好。实际上,您在这里的原子操作唯一需要的是它是不可分割的,您不需要“正常”原子操作的顺序保证。
关于使用 atomic_fetch_add_explicit 创建计数器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36778082/