C 您所在的位置:网站首页 atomic的作用 C

C

#C| 来源: 网络整理| 查看: 265

Atomic types Syntax _Atomic(type-name) (1) (since C11) _Atomictype-name (2) (since C11) 1)作为类型指定符使用;这指定了一个新的原子类型。 2)用作类型限定符;这指定类型名称的原子版本。在此期间,它可以是具有混合的常量,易失性,以及限制),虽然不像其他限定符,类型名称的原子版本可能具有不同的尺寸,取向,和对象表示。 type-name - 非数组或函数的任何类型。对于(1),type-name也不能是原子型或cvr限定型。

头文件 定义了37 个便利类型别名,从 atomic_bool 到 atomic_uintmax_t ,它们简化了这个关键字与内置和库类型的使用。

_Atomic const int * p1; // p是指向原子const int的指针 const atomic_int * p2; // same const _Atomic(int) * p3; // same

如果宏常量 __STDC_NO_ATOMICS__ 由编译器定义,则不提供关键字 _Atomic 。

Explanation

原子类型的对象是唯一没有数据竞争的对象;也就是说,它们可以由两个线程同时修改或由一个线程修改并由另一个线程读取。

每个原子对象都有自己相关的modification order,这是对该对象进行修改的总顺序。如果,从某个线程的点,修改 A 一些原子M的之前发生变形 B 相同原子M的,则在M的修改次序,A B之前发生

请注意,尽管每个原子对象都有自己的修改顺序,但没有单一的总顺序;不同的线程可能会观察到不同原子对象的修改顺序不同。

有四种一致性是所有原子操作的保证。

write-write coherence:如果操作A修改了原子对象Mhappens-before一个修改M的操作B,那么在M的修改顺序中,A比B早出现。 读-读相干性:如果原子对象M的值计算A在M的值计算B之前发生,并且A从对M的副作用X中获取其值,则B所计算的值就是X所存储的值或是由副作用Y在M上存储的值,其中Y在M的修改顺序中晚于X出现。 读写一致性:如果原子对象M的值计算Ahappens-beforeM上的一个操作B,那么A从M上的一个副作用X中取值,其中X在M的修改顺序中出现在B之前。 读写一致性:如果在原子对象M上有副作用Xhappens-beforeM的一个值计算B,那么评价B的值来自X或来自M的修改顺序中X之后出现的副作用Y。

一些原子操作也是同步操作。它们可能具有其他释放语义,获取语义或顺序一致的语义。参见 memory_order 。

内置的递增和递减运算符以及复合赋值是具有完全顺序一致排序的读-修改-写原子操作(就像使用 memory_order_seq_cst 一样)。如果需要不太严格的同步语义,则可以使用标准库函数。

原子属性仅对左值表达式有意义。左值到右值转换(模拟从原子位置到CPU寄存器的内存读取)将原子性与其他限定符一起剥夺。

Notes

访问原子结构/union的成员是未定义的行为。

库类型 sig_atomic_t 不提供线程间同步或内存排序,仅提供原子性。

该挥发性类型不提供线程间同步,内存排序,或原子。

建议实现以确保 C 中 _Atomic(T) 的表示与C++ 中的 _Atomic(T) std::atomic 对于每种可能的类型 T 的表示相同。用于确保原子性和内存排序的机制应该是兼容的。

Keywords

_Atomic.

Example #include #include #include atomic_int acnt; int cnt; int f(void* thr_data) { for(int n = 0; n < 1000; ++n) { ++cnt; ++acnt; //对于此示例,宽松的内存顺序就足够了,例如 // atomic_fetch_add_explicit(&acnt,1,memory_order_relaxed); } return 0; } int main(void) { thrd_t thr[10]; for(int n = 0; n < 10; ++n) thrd_create(&thr[n], f, NULL); for(int n = 0; n < 10; ++n) thrd_join(thr[n], NULL); printf("The atomic counter is %u\n", acnt); printf("The non-atomic counter is %u\n", cnt); }

Possible output:

The atomic counter is 10000 The non-atomic counter is 8644 References C17标准(ISO/IEC 9899:2018)。 6.7.2.4 原子类型指定器 (p:87) 7.17 原子 (p: 200-209) C11标准(ISO/IEC 9899:2011)。 6.7.2.4 原子类型说明者(第121页) 7.17 Atomics (p: 273-286) See also atomic 的C++ 文档 C ASCII Chart Inline assembly Attribute specifier sequence(since C23) C attribute: deprecated (since C23)

1 … 168 169 170 171 172 … 571 Next



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有