美文网首页
原子操作atomic_fetch_add

原子操作atomic_fetch_add

作者: 香菜那么好吃为什么不吃香菜 | 来源:发表于2020-07-20 21:46 被阅读0次

定义

在头文件<stdatomic.h>中定义

C atomic_fetch_add(volatile A * obj,M arg);
C atomic_fetch_add_explicit(volatile A * obj,M arg,memory_order order);


作用

作用:原子替换(obj + arg -> obj), 并返回obj之前的值。

怎么理解呢?就像是i++,先返回i之后再加,只不过这里可以加arg,并且是原子操作的。我们知道i++并不是原子操作。


参数

obj和arg通过“作用”部分你应该已经知道是做什么的啦,我们主要讲一下memory_order order是什么。

第一个函数的order默认是memory_order_seq_cst;
第二个函数的order原则上可以为memory_order中的任意值,我们来看一下memory_order是什么吧~

memory_order

定义
enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
};
含义
typedef enum memory_order {
memory_order_relaxed, // 不对执行顺序做保证,只保证此操作是原子的
memory_order_acquire, // 本线程中,所有后续的读操作必须在本条原子操作完成后执行
memory_order_release, // 本线程中,所有之前的写操作完成后才能执行本条原子操作
memory_order_acq_rel, // 同时包含 memory_order_acquire 和 memory_order_release
memory_order_consume, // 本线程中,所有后续的有关本原子类型的操作,必须在本条原子操作完成之后执行
memory_order_seq_cst // 全部存取都按顺序执行
} memory_order;


实例

#include <stdio.h>#include <threads.h>
#include <stdatomic.h>
 atomic_int acnt;int cnt;
 int f(void* thr_data){
    for(int n = 0; n < 1000; ++n) {
        atomic_fetch_add_explicit(&acnt, 1, memory_order_relaxed); // atomic
        ++cnt; // undefined behavior, in practice some updates missed
    }
    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);}

输出可能如下
The atomic counter is 10000The non-atomic counter is 9511

相关文章

  • 第10章 内核同步方法

    一、原子操作 原子操作可以操作指令以原子的方式执行,执行过程不会被打断。 1.1 原子整数操作 针对整数的原子操作...

  • Java自学-多线程 原子访问

    多线程 原子访问 步骤 1 : 原子性操作概念 所谓的原子性操作即不可中断的操作,比如赋值操作 原子性操作本身是线...

  • Go语言 原子操作

    原子操作就是不可中断的操作,外界是看不到原子操作的中间状态,要么看到原子操作已经完成,要么看到原子操作已经结束。在...

  • 高并发(12)-原子操作类的使用

    @TOC 前言 上篇文章讲解了什么是原子操作,并且怎么实现原子操作。今天就讲一下原子的操作类 什么是原子操作类 为...

  • 11--多线程探索--锁分析

    一、线程相关概念 1.1 原子操作 原子和原子操作 原子操作:不可分割的操作。该操作一定是在同一个CPU时间片中完...

  • 定义属性时,常用的关键字及其作用详解

    atomic: 原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操...

  • C++原子性操作,volatile关键字

    原子性操作 原子性操作比加锁访问临界资源更加高效。现代CPU支持一些原子性操作 使用原子性操作实现无锁队列。。。参...

  • Java并发机制底层实现原理-原子操作的实现原理

    章节目录 原子操作含义 相关术语 保证多处理器操作原子性的两种方式 Java语言层面上实现原子操作 原子操作的含义...

  • 从CAS讲起,真正高性能解决并发编程的原子操作

    今天呢!灯塔君跟大家讲: 高性能解决并发编程的原子操作 一.原子性操作 原子性操作:原子性在一个操作是不可中断的,...

  • Java原子类

    1、原子类的分类 原子操作是指一个不可中断的操作。 原子类是指具有原子操作特征的类。 JUC并发包中的原子类都存放...

网友评论

      本文标题:原子操作atomic_fetch_add

      本文链接:https://www.haomeiwen.com/subject/haawkktx.html