linux无锁化编程
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无锁化编程相关推荐
- linux无锁化编程--__sync_fetch_and_add系列原子操作函数
linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令 ...
- mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统
原标题:源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统 作者介绍 张永翔,现任网易云RDS开发,持续关注MySQL及数据库运维领域,擅长MySQL运维,知乎ID:雁南归. MySQL ...
- 上篇 | 说说无锁(Lock-Free)编程那些事
1. 引言 现代计算机,即使很小的智能机亦或者平板电脑,都是一个多核(多CPU)处理设备,如何充分利用多核CPU资源,以达到单机性能的极大化成为我们码农进行软件开发的痛点和难点.在多核服务器中,采用多 ...
- C语言链表无锁化CAS,CAS无锁操作
主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结些要点. CAS就是Compare And Swap.gcc可以调用: __sy ...
- linux 无锁队列覆盖问题,无锁队列杂谈
质量最大vczh粉(402740419) 10:13:17 nobody(1575393351) 10:10:09 无锁队列,怎么可能 ? 质量最大vczh粉(402740419) 10:13:23 ...
- 下篇 | 说说无锁(Lock-Free)编程那些事(下)
6 内存屏障(Memory Barriers) 6.1 What Memory Barriers? 内存屏障,也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的 ...
- linux无锁队列性能对比,无锁队列的一种实现
队列作为最常用的基础数据结构之一,相信大家都已经非常非常熟悉了,这里省略关于队列的介绍.在平时开发中队列的出现频率非常非常高,因此我们也会很关心队列的性能问题.当并发访问队列时,队列的性能往往受到同步 ...
- Linux无锁共享内存,优秀数据结构学习 - 共享内存无锁队列的实现(二)
优秀数据结构学习 - 共享内存无锁队列的实现(二) 优秀数据结构学习 - 共享内存无锁队列的实现(二) 1 关键技术 操作系统提供的进程间通信机制有文件.socket.消息队列.管道.共享内存等.其中 ...
- C语言链表无锁化CAS,使用GCC CAS内置函数构建无锁链表
需要了解 CMPXCHG 和 CMPXCHG8B 等相关指令是因为它们构成了无锁解决方案的核心.但是,不必使用汇编语言编写代码.GCC (GNU Compiler Collection,4.1 和更高 ...
最新文章
- SpringCloud Alibaba微服务实战(二) - Nacos服务注册与restTemplate消费
- SAP 零售商品listing不成功,补充listing的方法
- java中正则表达式 ?=_Java中的正则表达式
- 用信号量和读写锁解决读者写者问题
- win7更新错误0x800b0109_win10 5月版严重翻车,更新频出10多个bug,看完你还敢升级吗?...
- 全球计算机与工程学科排名:MIT夺冠 中国23所高校上榜
- OpenGL研究, GUI框架分析, 虚拟机比较, Win10历险记, WxWidget, uboot, WireShark
- 在Xcode6中搭建Python开发环境
- 你应该升级到SQL Server 2005还是SQL Server 2008?
- mysql 打开远程服务
- 微信好友管理工具_助手_系统软件哪个最好?
- cpuz测试分数天梯图_cpubenchmark(2020电脑cpu性能天梯图)
- 利用Python爬虫和Tableau分析链家网二手房信息
- 【杂项】vmware fusion 流畅度设置
- HTTP 请求头 Header
- 程序设计(二)——伪代码编程
- 赋值运算和赋值表达式
- java zxing条形码去掉两边空白,密度调整,固定条形码宽度
- iperf测试工具使用方法
- oracle通信通道的文件结尾_Oracle错误——ORA-03113:通信通道的文件结尾 解决办法...
热门文章
- 【运筹学】线性规划数学模型 ( 单纯形法 | 第二次迭代 | 方程组同解变换 | 生成新单纯形表 | 计算检验数 | 最优解判定 | 线性规划解个数分析 )
- ElasticSearch 5.5 离线环境的完整安装及配置详情,附kibana、ik插件配置及安装包下载路径...
- SVA Function Coverage
- Django基础(四)
- 转载:VMware workstation创建虚拟机,安装Ubuntu系统
- Java编译器、JVM、解释器
- win7系统怎么获取system权限?
- 购买阿里云服务器地域如何选择?
- 【译】Go语言声明语法
- Newtonsoft.Json的简单使用