用 atomic_fetch_add_explicit 创建一个计数器
Creating a counter with atomic_fetch_add_explicit
#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
的调用和对 [=14= 的提取], 在存储 request->id
.
的值之前
这是正确的吗?我相当确定它是但我想绝对确定以防原子学需要考虑其他事情。
你只做一个原子操作,当你从它 return 中得到你的价值。其他一切都是使用 "normal" 内存模型完成的,就像它对顺序代码一样,一如既往。
赋值末尾的;
为序列点。所以你的方法非常好。实际上,您在这里的原子操作唯一需要的是它是不可分割的,您不需要 "normal" 原子操作的顺序保证。
#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
的调用和对 [=14= 的提取], 在存储 request->id
.
这是正确的吗?我相当确定它是但我想绝对确定以防原子学需要考虑其他事情。
你只做一个原子操作,当你从它 return 中得到你的价值。其他一切都是使用 "normal" 内存模型完成的,就像它对顺序代码一样,一如既往。
赋值末尾的;
为序列点。所以你的方法非常好。实际上,您在这里的原子操作唯一需要的是它是不可分割的,您不需要 "normal" 原子操作的顺序保证。