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并 ...
随机推荐
- 每日一道 LeetCode (1):两数之和
引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...
- 从0到1:开启CAN通信学习(一)
1 初识CAN通信 说起CAN通信,可能很多人都比较陌生,但实际上我们却一直在和它打交道.随着家用汽车的普及,我们开车过程中的每次刹车.每次踩油门,甚至每次的开车门.开车窗,其实都是CAN通信的应用 ...
- PHP curl_share_setopt函数
(PHP 5 >= 5.5.0) curl_share_setopt — 设置 cURL 共享句柄的一个选项. 说明 bool curl_share_setopt ( resource $sh ...
- PHP zip_read() 函数
定义和用法 zip_read() 函数读取打开的 zip 档案中的下一个文件.高佣联盟 www.cgewang.com 如果成功,该函数则返回包含 zip 档案中一个文件的资源.如果没有更多的项目可供 ...
- C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制!
我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1.9.10.297.952 等,一个数字最多能表示九,如果要表示十.十一.二十九.一百等,就需要多个数字组合起来. 例如表示 5+8 的结果 ...
- C/C++编程笔记:C语言预处理命令是什么?不要以为你直接写#就行!
很多小伙伴在自己写代码的时候,已经多次使用过#include命令.使用库函数之前,应该用#include引入对应的头文件.其实这种以#号开头的命令称为预处理命令. C语言源文件要经过编译.链接才能生成 ...
- 2019 HL SC day2
今天讲的是网络流 大部分题目都写过了 这里 就总结一番. bzoj 1066 裸的最大流 不过需要拆点细节方面有一点坑 剩下的 没什么了. //#include<bits/stdc++.h> ...
- bzoj 题目选做
这里将记录着我在接下来的日子里在bzoj上遇到的各种 毒瘤题目 1.轮状病毒 题目是很没意思的 列出状态 显然无法递推 我简单推了一下加动态加点的状态 嗯发现规律没有那么简单 打表 也不太能发现吧 正 ...
- Spark Streaming高吞吐、高可靠的一些优化
分享一些Spark Streaming在使用中关于高吞吐和高可靠的优化. 目录 1. 高吞吐的优化方式 1.1 更改序列化的方式 1.2 修改Receiver接受到的数据的存储级别 1.3 广播配置变 ...
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 可能很多新手都会遇到同样的问题:我要我的Asp.net ...