#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/

10-11 23:18
查看更多