用 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" 原子操作的顺序保证。