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

没有atomic.h后如何在linux实现原子操作

 
阅读更多
有个/usr/include/alsa/iatomic.h,也能实现原子操作,使用的时候#include就可以了,原有的atomic系列函数这里都有,包括atomic_read、atomic_set、 atomic_inc、atomic_add、atomic_sub。

只支持32位数据的原子操作。

-------------------------------正文---------------------------------------

     在Linux2.6.18之后,删除了和,GCC提供了内置的原子操 作函数,更适合用户态的程序使用。现在atomic.h在内核头文件中,不在gcc默认搜索路径下,即使像下面这样强行指定路径,还是会出现编译错误。


    #include 

gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作,我是传送门。

可以对1,2,4或8字节长度的数值类型或指针进行原子操作,其声明如下
view plainprint?

    type __sync_fetch_and_add (type *ptr, type value, ...) 
    type __sync_fetch_and_sub (type *ptr, type value, ...) 
    type __sync_fetch_and_or (type *ptr, type value, ...) 
    type __sync_fetch_and_and (type *ptr, type value, ...) 
    type __sync_fetch_and_xor (type *ptr, type value, ...) 
    type __sync_fetch_and_nand (type *ptr, type value, ...) 
              { tmp = *ptr; *ptr op= value; return tmp; } 
              { tmp = *ptr; *ptr = ~tmp & value; return tmp; }   // nand 
     
    type __sync_add_and_fetch (type *ptr, type value, ...) 
    type __sync_sub_and_fetch (type *ptr, type value, ...) 
    type __sync_or_and_fetch (type *ptr, type value, ...) 
    type __sync_and_and_fetch (type *ptr, type value, ...) 
    type __sync_xor_and_fetch (type *ptr, type value, ...) 
    type __sync_nand_and_fetch (type *ptr, type value, ...) 
              { *ptr op= value; return *ptr; } 
              { *ptr = ~*ptr & value; return *ptr; }   // nand 

这两组函数的区别在于第一组返回更新前的值,第二组返回更新后的值,下面的示例引自这里。


view plainprint?

    #include  
    #include  
    #include  
     
    static int count = 0; 
     
    void *test_func(void *arg) 
    { 
            int i=0; 
            for(i=0;i<20000;++i){ 
                    __sync_fetch_and_add(&count,1); 
            } 
            return NULL; 
    } 
     
    int main(int argc, const char *argv[]) 
    { 
            pthread_t id[20]; 
            int i = 0; 
     
            for(i=0;i<20;++i){ 
                    pthread_create(&id[i],NULL,test_func,NULL); 
            } 
     
            for(i=0;i<20;++i){ 
                    pthread_join(id[i],NULL); 
            } 
     
            printf("%d/n",count); 
            return 0; 
    } 

对于使用atomic.h的老代码,可以通过宏定义的方式,移植到高内核版本的linux系统上,例如

http://www.cppblog.com/qinqing1984/archive/2011/08/31/154770.html
分享到:
评论

相关推荐

    drm_atomic.rar_DRM_empty

    在"drm_atomic.c"和"drm_atomic.h"这两个文件中,我们可以预期找到实现原子更新的代码和接口定义。"drm_atomic.c"可能包含了原子更新的处理逻辑,包括状态分配、检查、提交和回滚等操作。而"drm_atomic.h"则可能包含...

    Linux驱动并发控制之位原子操作.pdf

    在 Linux 驱动中,位原子操作是实现并发控制的常用方法之一。 二、常用的位原子操作函数 在 Linux 驱动中,常用的位原子操作函数包括: * 设置位:void set_bit(nr, void *ptr) * 清除位:clear_bit(nr, void *...

    atomic64.rar_Linux/Unix编程_Unix_Linux_

    在Linux和Unix操作系统中,原子操作(Atomic Operations)是多线程编程中不可或缺的一部分,它们保证了在并发环境下数据的完整性。"atomic64.rar"这个压缩包包含的"atomic64.c"和"atomic64.h"文件,很可能是关于实现...

    drm_atomic_helper.rar_legacy

    而“_atomic_helper”通常与Linux内核中的原子操作(Atomic Operations)相关,这些操作是无锁编程的一部分,确保在多线程环境中数据的一致性和完整性。在Linux DRM子系统中,原子帮助器(Atomic Helper)是用于处理...

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

    原子操作的API主要定义在`include/asm/atomic.h`文件中,这些API通常用汇编语言实现,因为C语言本身无法直接支持原子性操作。以下是常用的几个原子操作API: 1. **atomic_read(atomic_t *v)**:读取原子变量`v`的值...

    Linux操作系统源代码详细分析.pdf

    - **asm-i386/atomic.h**:原子操作的定义,用于实现线程安全。 - **asm-i386/elf.h**:定义了ELF格式相关的数据结构。 - **asm-i386/hardirq.h**:硬件中断相关的宏和函数声明。 - **asm-i386/page.h**:页面管理的...

    linux 2.6.32内核目录树

    - `atomic.h`:原子操作定义。 - `auxvec.h`:辅助向量定义。 - `barrier.h`:内存屏障相关定义。 - `bitops.h`:位操作宏定义。 - `bitsperlong.h`:每长整型的位数定义。 - `bug.h`:调试宏定义。 - `bugs....

    Linux下的系统调用和进程

    在ARMLinux系统中,原子操作主要通过硬件支持实现,其API和原子类型的定义存储在内核源码树的`include/asm/atomic.h`文件中。原子操作通常用于实现资源计数,例如,引用计数(`refcnt`)的管理,保证了在并发环境下的...

    Linux应用程序之线程通信

    在Linux中,可以使用`&lt;stdatomic.h&gt;`头文件提供的原子类型和操作来实现。例如,原子递增`atomic_fetch_add()`和原子比较并交换`atomic_compare_exchange_weak()`等,这些操作在多线程环境下避免了数据竞争,提高了...

    linux学习重点1

    原子操作需要硬件的支持,因此是架构相关的,其 API 和原子类型的定义都定义在内核源码树的include/asm/atomic.h 文件中。原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。 自旋锁...

    并发和竞态PPT课件.pptx

    在Linux中,提供了原子操作的API,定义在`&lt;atomic.h&gt;`头文件中。 【原子整数操作】如`atomic_t`类型,用于实现原子的整数增加、减少等操作。例如,`atomic_set()`用于初始化原子整数,`atomic_add()`用于原子性地...

    pc104 arm linux 驱动

    - `atomic_t`: 原子变量类型,用于实现原子操作,即不可被中断的操作。 - `tasklet_struct`: 任务项结构体,用于实现异步任务调度。 ##### 4. 函数声明 ```c static irqreturn_t pc104_interrupt(int irq, void *_...

    Unreliable Guide To Hacking The Linux Kernel

    - **延时操作(mdelay()/udelay())**:`#include &lt;asm/delay.h&gt;` 和 `#include &lt;linux/delay.h&gt;`,用于实现毫秒级或微秒级的延迟。 - **字节序转换(cpu_to_be32()/be32_to_cpu()/cpu_to_le32()/le32_to_cpu())**...

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

    这些操作定义在`&lt;atomic.h&gt;`头文件中,包括原子整数操作和原子位操作。原子整数操作如`atomic_set`、`atomic_add`、`atomic_inc`等,可以确保对`atomic_t`类型的变量进行的增加、设置等操作不会被其他线程打断。而...

    libatomic_ops:atomic_ops项目(原子内存更新操作可移植的实现)

    该软件包提供了对许多体系结构上硬件提供的原子内存更新操作的半便携式访问。 这些可能使您可以编写代码: 这在信号处理程序中做了更多有趣的事情。 通过允许您编写巧妙的无锁代码,可以更有效地利用多处理器。 请...

    LINUX驱动程序_LED+定时器实现流水灯

    - **`atomic_t`类型**:用于实现对整型变量的原子操作,避免多任务环境下因上下文切换导致的数据不一致性问题。 - **原子操作函数**:`atomic_inc`、`atomic_dec`、`atomic_read`分别用于对`atomic_t`类型的变量...

    linux关于进程同步的说明

    在Linux中,信号量的数据结构定义在`include/asm/semaphore.h`中,其基本结构如下: ```c struct semaphore { atomic_t count; int sleepers; wait_queue_head_t wait; }; ``` - **count**:表示信号量的当前值...

Global site tag (gtag.js) - Google Analytics