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类的更多相关文章

  1. muduo源码解析5-mutex相关类

    mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...

  2. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...

  3. AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍

    AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...

  4. muduo源码解析11-logger类

    logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...

  5. muduo源码解析10-logstream类

    FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...

  6. Netty源码解析 -- 内存对齐类SizeClasses

    在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法. 源码分析基于Netty 4.1.52 Nett ...

  7. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  8. java源码解析之Object类

    一.Object类概述   Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解   Object的方法可以分成两类,一类是被关键字fin ...

  9. Bulma 源码解析之 .columns 类

    {说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...

  10. java源码解析之String类(二)

    上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...

随机推荐

  1. Redis系列(九):Redis的事务机制

    提到事务,相信大家都不陌生,事务的ACID四大特性,也是面试时经常问的,不过一般情况下,我们可能想到的是传统关系型数据库的事务,其实,Redis也是提供了事务机制的,本篇博客就来讲解下Redis的事务 ...

  2. pandas_使用属性接口实现高级功能

    C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx 这个文档自己创建就可以,以下几篇文章仅作为参考 import pandas as pd import copy ...

  3. 记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用

    记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用 目录 大文件无法push到远程仓库 问题 commit的大文件无法push到远程库解决办法 git filter ...

  4. PHP XML DOM:DOM 是什么?

    PHP XML DOM 内建的 DOM 解析器使在 PHP 中处理 XML 文档成为可能. DOM 是什么? W3C DOM 提供了针对 HTML 和 XML 文档的标准对象集,以及用于访问和操作这些 ...

  5. PHP fwrite() 函数

    定义和用法 fwrite() 函数将内容写入一个打开的文件中. 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行. 如果函数成功执行,则返回写入的字节数.如果失败,则返回 FA ...

  6. PDOStatement::fetchObject

    PDOStatement::fetchObject — 获取下一行并作为一个对象返回.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.4)高佣联盟 www.cgewang ...

  7. samba服务及配置

    samba 目录 samba 1. samba简介 2. samba访问 配置示例 3.搭建用户认证共享服务器 4.搭建匿名用户共享服务器 1. samba简介 Samba是在Linux和UNIX系统 ...

  8. MyFirstJavaWeb

    源代码: Register.jsp <%@ page language="java" contentType="text/html; charset=utf-8&q ...

  9. 02【Collection、泛型】

    主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合 ...

  10. java基础之字符串

    以下内容摘自<java编程思想>第十三章. 1. 不可变 String String 对象是不可变对象,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全 ...