精华内容
下载资源
问答
  • linux C原子加操作

    2020-10-13 17:16:39
    gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供减和逻辑运算的原子操作。可以对1,2,4或8字节长度的数值类型或指针进行原子操作,其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) ...

    gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。可以对1,2,4或8字节长度的数值类型或指针进行原子操作,其声明如下:

    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, ...)
    
    #define ATOMIC_ADD(x,y) __sync_fetch_and_add (x,y)
    int val = 0;
    ATOMIC_ADD(&val, 12); // val is 12
    

     

    展开全文
  • Linux原子操作

    2019-09-16 07:14:59
    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 val...
    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);
    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);
    

    以上函数不需要任何头文件

    bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
    type __sync_val_compare_and_swap (type *ptr, type oldval,  type newval, ...)
    

    上面两个是比较赋值,oldval==ptr,则把newval赋值给ptr,第一个函数返回是否相等的bool,第二个返回*ptr的旧值

    __sync_synchronize (...)
    

    参照http://www.sunchangming.com/blog/post/1632.html

    转载于:https://my.oschina.net/chzhuo/blog/482080

    展开全文
  • linux 原子操作

    2014-11-10 22:33:41
    http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.bg.doc%2Fcompiler_ref%2Fbif_gcc_atomic_add_fetch.html

    http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.bg.doc%2Fcompiler_ref%2Fbif_gcc_atomic_add_fetch.html

    __sync_add_and_fetch

    Purpose

    This function atomically adds the value of __v to the variable that __p points to. The result is stored in the address that is specified by __p.

    A full memory barrier is created when this function is invoked.

    Prototype

    T __sync_add_and_fetch (T__pU __v, ...);

    Parameters

    __p
    The pointer of a variable to which __v is to be added. The value of this variable is to be changed to the result of the add operation.
    __v
    The variable whose value is to be added to the variable that __p points to.

    Return value

    The function returns the new value of the variable that __p points to.

    类似于i++;

    展开全文
  • linux原子操作

    2013-05-09 22:07:43
    gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供减和逻辑运算的原子操作。 其声明如下:   type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr, type ...

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

    其声明如下:

     

    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, ...)


    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, ...)
     

     


    这两组函数的区别在于第一组返回更新前的值,第二组返回更新后的值。

    type可以是1,2,4或8字节长度的int类型,即:
     


    int8_t / uint8_t
    int16_t / uint16_t
    int32_t / uint32_t
    int64_t / uint64_t
     

     

    后面的可扩展参数(...)用来指出哪些变量需要memory barrier,因为目前gcc实现的是full barrier(类似于linux kernel 中的mb(),表示这个操作之前的所有内存操作不会被重排序到这个操作之后),所以可以略掉这个参数。

     


    bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
    type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)


    这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
    第一个函数在相等并写入的情况下返回true.
    第二个函数在返回操作之前的值。

     

    __sync_synchronize (...)

    发出一个full barrier.

    关于memory barrier,cpu会对我们的指令进行排序,一般说来会提高程序的效率,但有时候可能造成我们不希望得到的结果,举一个例子,比如我们有一个硬件设备,它有4个寄存器,当你发出一个操作指令的时候,一个寄存器存的是你的操作指令(比如READ),两个寄存器存的是参数(比如是地址和size),最后一个寄存器是控制寄存器,在所有的参数都设置好之后向其发出指令,设备开始读取参数,执行命令,程序可能如下:
     

        write1(dev.register_size,size);
        write1(dev.register_addr,addr);
        write1(dev.register_cmd,READ);
        write1(dev.register_control,GO);

    如果最后一条write1被换到了前几条语句之前,那么肯定不是我们所期望的,这时候我们可以在最后一条语句之前加入一个memory barrier,强制cpu执行完前面的写入以后再执行最后一条:
     


        write1(dev.register_size,size);
        write1(dev.register_addr,addr);
        write1(dev.register_cmd,READ);
        __sync_synchronize();
        write1(dev.register_control,GO);


    memory barrier有几种类型:
        acquire barrier : 不允许将barrier之后的内存读取指令移到barrier之前(linux kernel中的wmb())。
        release barrier : 不允许将barrier之前的内存读取指令移到barrier之后 (linux kernel中的rmb())。
        full barrier    : 以上两种barrier的合集(linux kernel中的mb())。


    还有两个函数:

    type __sync_lock_test_and_set (type *ptr, type value, ...)
       将*ptr设为value并返回*ptr操作之前的值。

    void __sync_lock_release (type *ptr, ...)
         将*ptr置0


    示例程序:
     


    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>

    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;
    }
    本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-06/37403.htm

    展开全文
  • linux无锁化编程--__sync_fetch_and_add系列原子操作函数

    万次阅读 多人点赞 2014-05-06 14:33:32
    __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以...__sync_fetch_and_add系列一共有十二个函数,有/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,
  • linux 原子操作函数簇

    2019-03-21 11:44:00
    测试下行为,然后封装下,跨平台的原子操作就可以了。一下内容来自:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html#Atomic-Builtins 6.51 Built-in functions for atomic memory access The following ...
  • linux gcc原子操作

    2012-10-23 18:33:01
    gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供减和逻辑运算的原子操作。 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr, type value, ...
  • 最近自己做了一些涉及多线程编程的... 通常遇到多线程互斥的问题,首先想到的就是加锁lock,通过互斥锁来进行线程间互斥,但是最近有看一些开源的项目,看到有一些同步读和操作的原子操作函数——__sync_fetch_and_a
  • 多线程条件下的计数器是服务器开发的常用操作,比如异步请求sessionid的活动,通常我们会用: ...当然我们知道,count++这种操作不是原子的。一个自操作,本质是分成三步的: 1、 从缓存取到寄存器 2、 在
  • Linux原子操作函数

    千次阅读 2017-12-15 15:34:18
    Linux 下gcc内置的原子操作函数 头文件 #include 编译时需要加上-march= cpu-type(可以设置为native 让系统自动去检测) //先获取值再操作 type __sync_fetch_and_add (type *ptr, type value, ...) ...
  • Linux下的原子操作

    2016-03-08 09:49:00
    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。 __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。Multithreaded ...
  • 原子操作
  • _ATOMIC_ADD_和_ATOMIC_SUB_是我实现的两个宏,分别对应__sync_fetch_and_add(x, y) __sync_fetch_and_sub(x,y) x需要传地址,y为要/减的数,可以替代多线程mutex编程 #include <bits/stdc++.h> #...
  • gcc从4.1.2开始提供了__sync_*系列的build-in函数,用于提供减和逻辑运算的原子操作,其声明如下: type __sync_fetch_and_add (type *ptr, type value, …):等同于将 ptr指向的内存加上 value值, 并且返回ptr...
  • 转载_Linux原子操作

    2013-02-04 13:36:02
    今天在开发的过程中遇到这么一个情形,有两个线程分别对一个 map 中的同一变量进行写操作(其中一个是1操作,另一个是赋零操作),这样会很不安全,通常情况下大家肯定会首先考虑用互斥锁,但是使用线程互斥锁之后...
  • __sync_fetch_and_add系列一共有十二个函数,有/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,先fetch,然后自,返回的是自以前的值。以count = 4为例,调用__sync_fetch_
  • linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。 下面的东西整理自网络。先感谢大家的分享!   __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇...
  • gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供减和逻辑运算的原子操作。 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub
  • 文章目录一、atomic types二、APINon-RMW opsRMW atomic operations三、TYPES (signed vs ...原子类型提供了一个接口,用于在CPU之间执行原子 RMW 操作(不支持MMIO上的原子操作,并且可能导致某些平台上出现致命陷
  •  当然我们知道,count++这种操作不是原子的。一个自操作,本质是分成三步的:  1 从缓存取到寄存器  2 在寄存器1  3 存入缓存。  由于时序的因素,多个线程操作同一个全局变量,会出现问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,059
精华内容 1,223
关键字:

linux原子加fetch

linux 订阅