muduo源码解析2-AtomicIntegerT类
AtomicIntegerT
template<typename T>
class atomicTntergerT:public noncopyable
{
};
作用:
与std::aotmic<int> 类似,主要实现对 int32_t 和 int64_t 类型的原子操作。
在内部并不是使用互斥锁实现原子性,而是利用__sync_val_compare_and_swap和__sync_fetch_and_add在内部实现原子操作。
成员变量:
private:
volatile T m_value;
volatile防止编译器对该变量进行优化,即直接在内存中进行存取,而不是优化到寄存器中进行存取,主要是为了防止变量的值在内存中和寄存器中不一致。
成员函数:
public:
atomicTntergerT():m_value(){}
T get()
{
return __sync_val_compare_and_swap(&m_value,,);
}
T getAndAdd(T x)
{
return __sync_fetch_and_add(&m_value,x);
}
T addAndGet(T x)
{
return __sync_add_and_fetch(&m_value,x);
}
T incrementAndGet()
{
return addAndGet();
}
T decrementAndGet()
{
return addAndGet(-);
} void add(T x)
{
getAndAdd(x);
}
void increment()
{
incrementAndGet();
}
void decrement()
{
decrementAndGet();
} T getAndSet(T x)
{
return __sync_lock_test_and_set(&m_value,x);
}
大多是常见的运算操作,只不过在这里全部实现了多线程环境下的原子操作。
测试:
计算任务:THREAD_NUM个线程让count++ NUM次
测试mutex,atomic和atomicInt64的性能
测试结果
mutex 2198041
atomic 346589
atomicInt64 345607
std::atomic和atomicInt64表现差不多.都比互斥锁要好一点
测试代码:
#include<iostream>
#include"base/timestamp.h"
#include"base/atomic.h" #include<mutex>
#include<atomic>
#include<thread> using namespace mymuduo; #define NUM 200000
#define THREAD_NUM 100 std::mutex mutex;
long long count1=;
std::atomic<int64_t> count2;
atomicInt64 count3; void workerthread1()
{
for(int i=;i<NUM;i++)
{
mutex.lock();
count1++;
mutex.unlock();
}
} void workerthread2()
{
for(int i=;i<NUM;i++)
count2++;
} void workerthread3()
{
for(int i=;i<NUM;i++)
count3.add();
} void test_performance()
{
timestamp t1(timestamp::now());
std::thread t[THREAD_NUM]; for(int i=;i<THREAD_NUM;i++)
t[i]=std::thread(workerthread1); for(int i=;i<THREAD_NUM;i++)
t[i].join(); std::cout<<timestamp::now().microSecSinceEpoch()-t1.microSecSinceEpoch()<<" ";
std::cout<<count1<<std::endl; t1=timestamp::now();
for(int i=;i<THREAD_NUM;i++)
t[i]=std::thread(workerthread2); for(int i=;i<THREAD_NUM;i++)
t[i].join();
std::cout<<timestamp::now().microSecSinceEpoch()-t1.microSecSinceEpoch()<<" ";
std::cout<<count2<<std::endl; t1=timestamp::now();
for(int i=;i<THREAD_NUM;i++)
t[i]=std::thread(workerthread3); for(int i=;i<THREAD_NUM;i++)
t[i].join();
std::cout<<timestamp::now().microSecSinceEpoch()-t1.microSecSinceEpoch()<<" ";
std::cout<<count3.get()<<std::endl; } int main()
{ test_performance(); }
muduo源码解析2-AtomicIntegerT类的更多相关文章
- muduo源码解析5-mutex相关类
mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...
- Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了
这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...
- AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍
AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...
- muduo源码解析11-logger类
logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...
- muduo源码解析10-logstream类
FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...
- Netty源码解析 -- 内存对齐类SizeClasses
在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法. 源码分析基于Netty 4.1.52 Nett ...
- AOP源码解析:AspectJExpressionPointcutAdvisor类
先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...
- java源码解析之Object类
一.Object类概述 Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解 Object的方法可以分成两类,一类是被关键字fin ...
- Bulma 源码解析之 .columns 类
{说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...
- java源码解析之String类(二)
上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...
随机推荐
- Kubernetes/K8s架构师实战集训营【中、高级班】-2020
下载地址: [中级班] 链接:https://pan.baidu.com/s/1FWAz2V7BPsObixlZyW93sw提取码:mvu0 [高级班] 链接:https://pan.baidu.co ...
- 保姆级教程,如何发现 GitHub 上的优质项目?
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...
- html中input提示文字样式修改
在很多网站上我们都看到input输入框显示提示文字,让我们一起来看看如果在input输入框中显示提示文字.我们只需要在<input>标签里添加:placeholder="提示文字 ...
- luoguP2154 [SDOI2009]虔诚的墓主人
SDOI2009虔诚的墓主人 喜闻乐见,我终于把此题读懂了..所以可以写了. 其实就是让我们求有多少个十字架 一个十字架的定义为中间有一个空地 周围4个正方向都有k棵树. 不难想到nm的暴力 我们预处 ...
- bzoj 2989: 数列
LINK:数列 需要动一点脑子 考虑查询 暴力显然不行 考虑把绝对值拆开. 当x<=y ax<=ay时 有 y-x+ay-ax<=k x+ax>=y+ay-k 可以发现在满足前 ...
- 发送ajax请求时候注意的问题
1.在发送ajax请求一般都是默认为异步,就是不去等待后台响应直接可以继续发送, 但这样会有时候遇到一些问题,无法获得后台的响应参数, 所以在你打开编辑弹出框完成数据编辑后无法刷新页面, 这时候可能存 ...
- spring中IOC入口与加载步骤
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-context.xml&q ...
- 您能解决这3个(看似)简单的Python问题吗?
尝试解决以下问题,然后检查以下答案. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识 ...
- 配置Django-TinyMCE组件支持上传图片功能
Django自带的Admin后台,好用,TinyMCE作为富文本编辑器,也蛮好用的,这两者结合起来在做博客的时候很方便(当然博客可能更适合用Markdown来写),但是Django-TinyMCE这个 ...
- 详解GaussDB(for MySQL)服务:复制策略与可用性分析
摘要:本文通过介绍GaussDB(for MySQL)读写路径,分析其可用性. 简介 数据持久性和服务可用性是数据库服务的关键特征. 在实践中,通常认为拥有 3 份数据副本,就足以保证持久性. 但是 ...