`
f002489
  • 浏览: 271899 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

atomic_inc 原子操作

    博客分类:
  • C
 
阅读更多
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。


原子操作

  所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。

  原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。

  原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:

typedef struct { volatile int counter; } atomic_t;

  volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。

  原子操作API包括:
atomic_read(atomic_t * v);

  该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。

atomic_set(atomic_t * v, int i);

  该函数设置原子类型的变量v的值为i。

void atomic_add(int i, atomic_t *v);

  该函数给原子类型的变量v增加值i。

atomic_sub(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i。

int atomic_sub_and_test(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i,并判断结果是否为0,如果为0,返回真,否则返回假。

void atomic_inc(atomic_t *v);

  该函数对原子类型变量v原子地增加1。

void atomic_dec(atomic_t *v);

  该函数对原子类型的变量v原子地减1。

int atomic_dec_and_test(atomic_t *v);

  该函数对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。

int atomic_inc_and_test(atomic_t *v);

  该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。

int atomic_add_negative(int i, atomic_t *v);

  该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。

int atomic_add_return(int i, atomic_t *v);

  该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。

int atomic_sub_return(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i,并且返回指向v的指针。

int atomic_inc_return(atomic_t * v);

  该函数对原子类型的变量v原子地增加1并且返回指向v的指针。

int atomic_dec_return(atomic_t * v);

  该函数对原子类型的变量v原子地减1并且返回指向v的指针。

  原子操作通常用于实现资源的引用计数,在TCP/IP协议栈的IP碎片处理中,就使用了引用计数,碎片队列结构struct ipq描述了一个IP碎片,字段refcnt就是引用计数器,它的类型为atomic_t,当创建IP碎片时(在函数ip_frag_create中),使用atomic_set函数把它设置为1,当引用该IP碎片时,就使用函数atomic_inc把引用计数加1。

  当不需要引用该IP碎片时,就使用函数ipq_put来释放该IP碎片,ipq_put使用函数atomic_dec_and_test把引用计数减1并判断引用计数是否为0,如果是就释放IP碎片。函数ipq_kill把IP碎片从ipq队列中删除,并把该删除的IP碎片的引用计数减1(通过使用函数atomic_dec实现)。


分享到:
评论

相关推荐

    原子操作、信号量、读写信号量和自旋锁的API

    13. **atomic_inc_return(atomic_t *v)**:将原子变量`v`的值加1,并返回原子变量`v`。 14. **atomic_dec_return(atomic_t *v)**:将原子变量`v`的值减1,并返回原子变量`v`。 **示例**: 在TCP/IP协议栈中,为了...

    linux下原子操作程序源码.zip

    例如,`atomic_inc`、`atomic_dec`函数用于增加或减少一个`atomic_t`变量的值。 2. `atomic_long_t`:对于需要更大范围计数的场景,Linux提供了`atomic_long_t`,它是一个长整型的原子类型。 3. `atomic_compare_...

    Linux内核同步机制

    * atomic_inc(atomic_t *v):该函数对原子类型变量 v 原子地增加 1。 * atomic_dec(atomic_t *v):该函数对原子类型的变量 v 原子地减 1。 * atomic_dec_and_test(atomic_t *v):该函数对原子类型的变量 v 原子地减 ...

    zynq的linux驱动5-使用原子操作实现mio资源的竞争保护

    - `atomic_inc()`, `atomic_dec()`: 分别用于增加和减少`atomic_t`变量的值,然后返回更新后的值。 - `atomic_cmpxchg()`: 用于比较并交换操作,如果当前值等于期望值,则原子地将值设置为新值。 - `atomic_xchg...

    附录A Linux内核API

    - `atomic_sub_and_test`, `atomic_dec_and_test`, `atomic_inc_and_test`: 这些函数在执行原子操作后还会进行条件测试。例如,`atomic_sub_and_test`在减法后判断结果是否为0,若为0则返回真,否则返回假。 3. **...

    并发和竞态PPT学习教案.pptx

    原子整数操作如`atomic_set`、`atomic_add`、`atomic_inc`等,可以确保对`atomic_t`类型的变量进行的增加、设置等操作不会被其他线程打断。而原子位操作则用于单独处理内存位置上的单个位,如`set_bit`、`clear_bit`...

    linux kernel 2.4-7 内核函数手册

    这一节详细介绍了原子操作函数,如 `atomic_read`, `atomic_set`, `atomic_add`, `atomic_sub`, `atomic_sub_and_test`, `atomic_inc`, `atomic_dec`, `atomic_dec_and_test`, `atomic_inc_and_test`, `atomic_add_...

    psr.rar_UP

    在C语言中,Linux内核等系统经常使用`atomic_t`类型和相关的`atomic_xxx`函数来实现原子操作,如`atomic_inc`、`atomic_dec`等,这些函数可以无锁地增加或减少一个计数值,而不会导致数据竞争问题。 描述中提到的...

    并发和竞态PPT课件.pptx

    例如,`atomic_set()`用于初始化原子整数,`atomic_add()`用于原子性地增加,`atomic_inc()`用于原子性地递增1,还有`atomic_dec_and_test()`等函数,它们确保了整数操作的完整性,不会因中断而破坏一致性。...

    linux内核kernel-api.pdf

    - **`atomic_inc`**: 增加原子变量的值。 - 示例:`atomic_inc(&my_atomic);` - 相当于 `atomic_add(1, &my_atomic);`。 - **`atomic_dec`**: 减少原子变量的值。 - 示例:`atomic_dec(&my_atomic);` - 相当于 `...

    Linux核心API文档

    **atomic_inc**:将原子变量增加1。 ```c atomic_inc(&my_atomic_var); ``` **atomic_dec**:将原子变量减少1。 ```c atomic_dec(&my_atomic_var); ``` **atomic_dec_and_test**:将原子变量减少1,并检查结果是否...

    韦东山linux第二期视屏文档整理1

    3. **增加/减少操作**:`atomic_inc(atomic_t *v)`和`atomic_dec(atomic_t *v)`分别增加和减少原子变量的值。 4. **测试操作**:`atomic_dec_and_test(atomic_t *v)`在减少原子变量后检查其是否为0,如果是则返回...

    ZYNQ 7010-7020实现原子变量测试(Linux驱动).zip

    为了解决这个问题,Linux内核提供了一套原子操作函数,如`atomic_t`类型和相关的原子操作API,如`atomic_inc()`、`atomic_dec_and_test()`等。这些函数确保了对原子变量的操作不会被中断,从而避免了竞态条件。 在...

    Linux内核编程与调试.pdf

    - `atomic_inc(&v)`:对原子变量`v`进行加1操作。 - `atomic_inc_and_test(&v)`:对原子变量`v`进行加1操作,并返回是否等于0。 - `atomic_sub_and_test(i, &v)`:在原子变量`v`的基础上减去整数值`i`,并返回是否...

    Linux Kernel API

    - **`atomic_inc`**: 原子递增操作。 - **`atomic_dec`**: 原子递减操作。 - **`atomic_dec_and_test`**: 原子递减并测试是否为零。 - **`atomic_inc_and_test`**: 原子递增并测试是否为零。 - **`atomic_add_...

    linux内核kernel-api

    - **atomic_inc**: 增加原子变量的值。 - **atomic_dec**: 减少原子变量的值。 - **atomic_dec_and_test**: 减少原子变量的值并测试结果是否为零。 - **atomic_inc_and_test**: 增加原子变量的值并测试结果是否为零...

    i.MX6ULL实现原子变量驱动【Linux驱动】.zip

    4. 原子变量的使用:可能包括`atomic_t`类型的声明、`atomic_inc()`,`atomic_dec_and_test()`等原子操作函数的调用,以实现对共享资源的无锁访问。 五、编译与运行 项目代码提供了可以直接编译运行的环境,这通常...

    linux mutex.c 内核源码分析

    Linux 提供了一系列原子操作接口,如`atomic_read()`、`atomic_set()`、`atomic_inc_return()`、`atomic_dec_return()`和`atomic_xchg()`,用于在多线程环境下安全地更新计数器或其他数据。 2. **内存屏障** 内存...

    Linux下的系统调用和进程

    `atomic_inc`函数是一个典型的原子操作示例,它用于对原子变量进行递增操作。相比于普通递增,`atomic_inc`的关键在于其原子性,确保了在多处理器环境中,递增操作不会被中断,从而避免了竞态条件的发生。此函数首先...

    linux kernel API

    - **`atomic_inc`**:原子地增加原子变量的值。 - **`atomic_dec`**:原子地减少原子变量的值。 - **`atomic_dec_and_test`**:原子地减少原子变量的值,并检查结果是否为零。 - **`atomic_inc_and_test`**:原子地...

Global site tag (gtag.js) - Google Analytics