非原子类型如何实现std :: atomic_ref?

娘惹

我想知道如何才能std::atomic_ref有效地实现std::mutex非原子对象每个对象一个),因为以下属性似乎很难实施:

相对于通过引用同一对象的任何其他atomic_ref施加的原子操作,通过atomic_ref施加到对象的原子操作是原子的。

特别是以下代码:

void set(std::vector<Big> &objs, size_t i, const Big &val) {
    std::atomic_ref RefI{objs[i]};
    RefI.store(val);
}

似乎很难实现,因为std::atomic_ref每次都需要以某种方式进行选择std::mutex(除非这是由相同类型的所有对象共享的大主锁)。

我想念什么吗?还是每个对象都有责任实施std::atomic_ref,因此要么是原子的要么携带一个std::mutex

彼得·科德斯

实现自身几乎完全相同std::atomic<T>这不是一个新问题。

请参阅std :: atomic的锁在哪里?一个典型的执行std::atomic/std::atomic_ref锁的静态哈希表,通过地址索引,非无锁的对象。哈希冲突只会导致额外的竞争,而不是正确性问题。(死锁仍然是不可能的;该锁仅由原子函数使用,从不尝试一次占用2个。)

例如,在GCC上,这std::atomic_ref是调用__atomic_store对象的另一种方法(请参阅GCC手册:atomic Builtins

编译器知道是否T足够小以致可以无锁。如果没有,它将调用使用该锁的libatomic库函数。

(有趣的事实:这意味着它仅在对象具有足够的对齐方式时才有效atomic<T>。但是在包括x86在内的许多32位平台上,uint64_t可能只有4字节对齐方式。atomic_ref在这样的对象上可以编译并运行,但如果编译器使用32位SSE 8字节加载/存储来实现它。幸运的是alignof(T) == sizeof(T),像64位体系结构中的大多数原始类型那样,具有对象的对象没有危险

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当外部基础类型未按要求对齐时的atomic_ref

来自分类Dev

std :: atomic如何实现

来自分类Dev

原子读然后用 std::atomic 写

来自分类Dev

将原子类型的指针分配给非原子类型的指针

来自分类Dev

如何分配原子类型的向量?

来自分类Dev

在c ++ 11中,可以使用std :: atomic在两个线程之间传输非原子数据

来自分类Dev

可以使用std :: atomic内存屏障在线程之间传输非原子数据吗?

来自分类Dev

在c ++ 11中,可以使用std :: atomic在两个线程之间传输非原子数据

来自分类Dev

原子类型的大小

来自分类Dev

与std :: atomic类型的比较语义

来自分类Dev

值类型 ref 的底层实现

来自分类Dev

分配给std :: atomic <double>变量是否保证是原子的?

来自分类Dev

如何实现atomic_flag?

来自分类Dev

Elisp原子类型分类

来自分类Dev

如何比较参数包中的类型(包括ref限定符)和std :: function参数的类型

来自分类Dev

gcc,__ atomic_exchange似乎会产生非原子的asm,为什么?

来自分类Dev

C ++ std :: atomic <bool> :: fetch_或未实现?

来自分类Dev

Clojure的ref vs原子并发

来自分类Dev

正确使用std :: atomic

来自分类Dev

如何实现PFObject子类的子类?

来自分类Dev

如何在std :: atomic <T>上实现简单的自旋锁,以使编译器不会对其进行优化?

来自分类Dev

如何在std :: atomic <T>上实现简单的自旋锁,以使编译器不会对其进行优化?

来自分类Dev

如何接受非相当通用但动态类型作为子类的参数?

来自分类Dev

即使使用了std :: atomic类型也遇到了种族

来自分类Dev

实现函子类型类

来自分类Dev

调整std :: vector <std :: atomic_bool>的大小,将true分配给所有原子布尔

来自分类Dev

CPU如何实现原子性?

来自分类Dev

如何使子类实现接口?

来自分类Dev

C / C ++基本类型是原子类型吗?

Related 相关文章

  1. 1

    当外部基础类型未按要求对齐时的atomic_ref

  2. 2

    std :: atomic如何实现

  3. 3

    原子读然后用 std::atomic 写

  4. 4

    将原子类型的指针分配给非原子类型的指针

  5. 5

    如何分配原子类型的向量?

  6. 6

    在c ++ 11中,可以使用std :: atomic在两个线程之间传输非原子数据

  7. 7

    可以使用std :: atomic内存屏障在线程之间传输非原子数据吗?

  8. 8

    在c ++ 11中,可以使用std :: atomic在两个线程之间传输非原子数据

  9. 9

    原子类型的大小

  10. 10

    与std :: atomic类型的比较语义

  11. 11

    值类型 ref 的底层实现

  12. 12

    分配给std :: atomic <double>变量是否保证是原子的?

  13. 13

    如何实现atomic_flag?

  14. 14

    Elisp原子类型分类

  15. 15

    如何比较参数包中的类型(包括ref限定符)和std :: function参数的类型

  16. 16

    gcc,__ atomic_exchange似乎会产生非原子的asm,为什么?

  17. 17

    C ++ std :: atomic <bool> :: fetch_或未实现?

  18. 18

    Clojure的ref vs原子并发

  19. 19

    正确使用std :: atomic

  20. 20

    如何实现PFObject子类的子类?

  21. 21

    如何在std :: atomic <T>上实现简单的自旋锁,以使编译器不会对其进行优化?

  22. 22

    如何在std :: atomic <T>上实现简单的自旋锁,以使编译器不会对其进行优化?

  23. 23

    如何接受非相当通用但动态类型作为子类的参数?

  24. 24

    即使使用了std :: atomic类型也遇到了种族

  25. 25

    实现函子类型类

  26. 26

    调整std :: vector <std :: atomic_bool>的大小,将true分配给所有原子布尔

  27. 27

    CPU如何实现原子性?

  28. 28

    如何使子类实现接口?

  29. 29

    C / C ++基本类型是原子类型吗?

热门标签

归档