muduo库中使用了几个linux无锁编程接口,这些函数在多线程下操作时无需加锁也能实现原子操作,而且加锁会影响性能。
__sync_val_compare_and_swap(type *ptr, type oldval,  type newval, ...)   如果*ptr == oldval,就将newval写入*ptr
__sync_fetch_and_add( &global_int, 1)   先fetch(获得),然后自加,返回的是自加以前的值
__sync_lock_test_and_set(type *ptr, type value, ...)    将*ptr设为value并返回*ptr操作之前的值

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>int sum = 0;/*void* adder1(void *p)
{for(int i = 0; i < 1000000; i++)  // 百万次{sum++;}return NULL;
}*//*void* adder2(void *p)
{int old = sum;for(int i = 0; i < 1000000; i++)  // 百万次{while(!__sync_bool_compare_and_swap(&sum, old, old + 1))  // 如果old等于sum, 就把old+1写入sum{old = sum; // 更新old}}return NULL;
}*/void* adder3(void *p)
{for(int i = 0; i < 1000000; i++)  // 百万次{__sync_fetch_and_add(&sum,1);      }return NULL;
}int main()
{pthread_t threads[10];for(int i = 0;i < 10; i++){pthread_create(&threads[i], NULL, adder3, NULL);}for(int i = 0; i < 10; i++){pthread_join(threads[i], NULL);}printf("sum is %d\n",sum);return 0;
}

addr1结果不是我们预期的,addr2和addr3是我们预期的(10000000),编译要加上选项-lpthread -march=nocona -mtune=generic

参考地址:https://blog.csdn.net/stpeace/article/details/81150393

https://blog.csdn.net/hzhsan/article/details/25124901

linux无锁化编程相关推荐

  1. linux无锁化编程--__sync_fetch_and_add系列原子操作函数

    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令 ...

  2. mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统

    原标题:源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统 作者介绍 张永翔,现任网易云RDS开发,持续关注MySQL及数据库运维领域,擅长MySQL运维,知乎ID:雁南归. MySQL ...

  3. 上篇 | 说说无锁(Lock-Free)编程那些事

    1. 引言 现代计算机,即使很小的智能机亦或者平板电脑,都是一个多核(多CPU)处理设备,如何充分利用多核CPU资源,以达到单机性能的极大化成为我们码农进行软件开发的痛点和难点.在多核服务器中,采用多 ...

  4. C语言链表无锁化CAS,CAS无锁操作

    主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结些要点. CAS就是Compare And Swap.gcc可以调用: __sy ...

  5. linux 无锁队列覆盖问题,无锁队列杂谈

    质量最大vczh粉(402740419) 10:13:17 nobody(1575393351)  10:10:09 无锁队列,怎么可能 ? 质量最大vczh粉(402740419) 10:13:23 ...

  6. 下篇 | 说说无锁(Lock-Free)编程那些事(下)

    6 内存屏障(Memory Barriers) 6.1 What Memory Barriers? 内存屏障,也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的 ...

  7. linux无锁队列性能对比,无锁队列的一种实现

    队列作为最常用的基础数据结构之一,相信大家都已经非常非常熟悉了,这里省略关于队列的介绍.在平时开发中队列的出现频率非常非常高,因此我们也会很关心队列的性能问题.当并发访问队列时,队列的性能往往受到同步 ...

  8. Linux无锁共享内存,优秀数据结构学习 - 共享内存无锁队列的实现(二)

    优秀数据结构学习 - 共享内存无锁队列的实现(二) 优秀数据结构学习 - 共享内存无锁队列的实现(二) 1 关键技术 操作系统提供的进程间通信机制有文件.socket.消息队列.管道.共享内存等.其中 ...

  9. C语言链表无锁化CAS,使用GCC CAS内置函数构建无锁链表

    需要了解 CMPXCHG 和 CMPXCHG8B 等相关指令是因为它们构成了无锁解决方案的核心.但是,不必使用汇编语言编写代码.GCC (GNU Compiler Collection,4.1 和更高 ...

最新文章

  1. SpringCloud Alibaba微服务实战(二) - Nacos服务注册与restTemplate消费
  2. SAP 零售商品listing不成功,补充listing的方法
  3. java中正则表达式 ?=_Java中的正则表达式
  4. 用信号量和读写锁解决读者写者问题
  5. win7更新错误0x800b0109_win10 5月版严重翻车,更新频出10多个bug,看完你还敢升级吗?...
  6. 全球计算机与工程学科排名:MIT夺冠 中国23所高校上榜
  7. OpenGL研究, GUI框架分析, 虚拟机比较, Win10历险记, WxWidget, uboot, WireShark
  8. 在Xcode6中搭建Python开发环境
  9. 你应该升级到SQL Server 2005还是SQL Server 2008?
  10. mysql 打开远程服务
  11. 微信好友管理工具_助手_系统软件哪个最好?
  12. cpuz测试分数天梯图_cpubenchmark(2020电脑cpu性能天梯图)
  13. 利用Python爬虫和Tableau分析链家网二手房信息
  14. 【杂项】vmware fusion 流畅度设置
  15. HTTP 请求头 Header
  16. 程序设计(二)——伪代码编程
  17. 赋值运算和赋值表达式
  18. java zxing条形码去掉两边空白,密度调整,固定条形码宽度
  19. iperf测试工具使用方法
  20. oracle通信通道的文件结尾_Oracle错误——ORA-03113:通信通道的文件结尾 解决办法...

热门文章

  1. 【运筹学】线性规划数学模型 ( 单纯形法 | 第二次迭代 | 方程组同解变换 | 生成新单纯形表 | 计算检验数 | 最优解判定 | 线性规划解个数分析 )
  2. ElasticSearch 5.5 离线环境的完整安装及配置详情,附kibana、ik插件配置及安装包下载路径...
  3. SVA Function Coverage
  4. Django基础(四)
  5. 转载:VMware workstation创建虚拟机,安装Ubuntu系统
  6. Java编译器、JVM、解释器
  7. win7系统怎么获取system权限?
  8. 购买阿里云服务器地域如何选择?
  9. 【译】Go语言声明语法
  10. Newtonsoft.Json的简单使用