zoukankan      html  css  js  c++  java
  • Linux -- GCC Built-in functions for atomic memory access

    下列内建函数旨在兼容Intel Itanium Processor-specific Application Binary Interface, section 7.4. 因此,这些函数区别于普通的GCC内建函数,不使用”__builtin_”前缀.

    这些函数被重载,可以传入多种类型的参数.Intel文档只允许使用unsigned的int,long,long long类型.GCC允许所有长度为1,2,4,8bytes的标量或指针.

    不是所有处理器都支持下述操作的,如果一个特定的操作不被支持,将会产生警告.

    1.RMW系列(Read-Modify-Write)

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

    两组函数都改变了*ptr的值.唯一的区别是__sync_fetch_and_xxx系列返回改变前的值, __sync_xxx_and_fetch系列返回改变后的值.另,nand操作为*ptr = ~*ptr & value(取非然后逻辑与)

    2.CAS系列(compare and swap)

    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

    bool版本函数在比较为true,newval成功写入*ptr时返回true.

    Val版本函数返回在操作进行前*ptr的值.

    3.发出full memory barrier

    __sync_synchronize (...)

    内存屏障是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作.

    内存屏障有两个功能:1,保证了屏障前的指令在屏障后的指令先行完成.2,一旦内存数据被推送到缓存,就确保所有缓存会对所有的共享数据同步并保持一致

    多线程编程中,存在CPU高速缓存和内存的一致性问题.一个处理器上的线程修改了某项数据,而在另一处理器上的线程可能仍然使用着该数据在专用cache(CPU中)的老值.解决方法是令该数据为volatile属性,或读该数据之前执行内存屏障

    4.上锁

    type __sync_lock_test_and_set (type *ptr, type value, ...)

    该函数表现为:把value写入*ptr,返回原先*ptr的值.

    一些处理器只支持value=1.

    因此,可以假定value=0为无锁,value=1为上锁

    5.解锁

    void __sync_lock_release (type *ptr, ...)

    表现为:把0写入*ptr

  • 相关阅读:
    张高兴的 UWP 开发笔记:用 Thumb 控件仿制一个可拖动 Button
    oracle并非所有变量都已绑定
    win7出现无法连接到代理服务器的错误,不能上网的问题的解决
    用asp.net c# HttpWebRequest获取网页源代码
    退出系统时跳出frame框架
    使用MagicAJax的AjaxPanel时有时会弹出"Using the AjaxCallHelper write methods outside of an AjaxCall is not allowed."
    UI学习网站
    Oracle服务无法启动,报:Windows无法启动OracleOraDb10g_home1TNSListener服务,错误 1067:进程意外终止。
    视频怎么下载大电脑上
    css模板
  • 原文地址:https://www.cnblogs.com/tuowang/p/9399117.html
Copyright © 2011-2022 走看看