Muduo-Base-Atomic
针对原子性操作进行封装, 下面是我们需要用到的原子操作函数,
有需要对此类进行扩展的话,可以根据下面的函数进行扩展.
原子操作需要加上一个编译选项
-march=i386(根据你CPU 的类型来写,也可以设置native 默认的体系结构)
//先获取再操作
type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr, type value, ...) type __sync_fetch_and_or (type *ptr, type value, ...) type __sync_fetch_and_and (type *ptr, type value, ...) type __sync_fetch_and_xor (type *ptr, type value, ...) type __sync_fetch_and_nand (type *ptr, type value, ...) //先操作再获取 type __sync_add_and_fetch (type *ptr, type value, ...) type __sync_sub_and_fetch (type *ptr, type value, ...) type __sync_or_and_fetch (type *ptr, type value, ...) type __sync_and_and_fetch (type *ptr, type value, ...) type __sync_xor_and_fetch (type *ptr, type value, ...) type __sync_nand_and_fetch (type *ptr, type value, ...)
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
上面的是原子比较和设置操作, 一个是返回bool类型,一个是type类型, 有点不同.
基本操作过程如下
1. 判定*ptr 和 oldval是否相等
2.如果相等 *ptr = newval, 返回的是oldval
3.如果不相等 直接返回 *ptr.
其实也就是返回最初的*ptr的值.
bool的话如下
1.判定*ptr和oldval是否相等
2.相等*ptr = newval, 返回true
3.不相等 不设置返回false
上述操作可以实现无锁队列.
无锁对列传送门: http://coolshell.cn/articles/8239.html
有时间可能会自己实现以下
#ifndef ATMOIC_H #define ATMOIC_H #include <atomic> template<typename T> class Atmoic { public: Atmoic(){} T value() { , ); } static bool CompareAndSwap(T& value, T& oldval, T& newval) { return __sync_bool_compare_and_swap(value, oldval, newval); } // n ++ T FetchAndAdd(T x) { return __sync_fetch_and_add(&value_, x); } T FetchAddSub(T x) { return __sync_fetch_and_add(&value_, -x); } T GetAndSet(T x) { return __sync_lock_test_and_set(&value_, x); } private: volatile T value_; }; typedef Atmoic<int> AtmoicInt32; typedef Atmoic<long long> AtmoicInt64; #endif // ATMOIC_H
Muduo-Base-Atomic的更多相关文章
- muduo网络库源码学习————原子性操作Atomic.h
原子性操作可以做到比互斥锁更小的开销,在多线程编程中原子性操作是非常有用的.Atomic.h文件位于muduo/base下,代码如下: // Use of this source code is go ...
- muduo网络库源码学习————线程类
muduo库里面的线程类是使用基于对象的编程思想,源码目录为muduo/base,如下所示: 线程类头文件: // Use of this source code is governed by a B ...
- 【Muduo库】【base】基本类
一.Timestamp类 1.类图如下: 2. 知识点 (1) 这个类继承了 muduo::copyable, 以及 boost::less_than_comparable. (2) ...
- muduo网络库学习笔记(10):定时器的实现
传统的Reactor通过控制select和poll的等待时间来实现定时,而现在在Linux中有了timerfd,我们可以用和处理IO事件相同的方式来处理定时,代码的一致性更好. 一.为什么选择time ...
- muduo::Connector、TcpClient分析
Connector TcpClient Connector Connector用来发起连接. 在非堵塞网络中,主动发起连接比被动接收连接更为复杂,由于要考虑错误处理,还要考虑重试. 主要难点在于 1. ...
- muduo库的简单使用-echo服务的编写
muduo库的简单使用 muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写. 它的使用方法很简单,参考这篇文章:TCP网络编程本质论 里面有这么几句: 我认为,TCP 网络编程最 ...
- Muduo 网络编程示例之零:前言
陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/ ...
- muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
一.MutexLock 类 class MutexLock : boost::noncopyable 二.MutexLockGuard类 class MutexLockGuard : bo ...
- muduo总结
总结说的有的过大,算是对自己学习的一个总结.兴许会不断补充. 模型总结 muduo是基于非堵塞的IO和事件驱动的网络库. muduo的总体结构时one loop per thread+threadpo ...
- muduo网络库源码学习————日志滚动
muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天.滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc #in ...
随机推荐
- SQL Server系统表sysobjects介绍与使用(转)
SQL Server系统表sysobjects介绍与使用 关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可 ...
- 分享使用method swizzling的经历
原文:http://www.cnblogs.com/lujianwenance/p/5800232.html 这是一个很蛋疼的过程,先说一下需求,列表页预加载更多(60%).当我看到这个需求的时候 ...
- 7-2 DBA顾问第一次上次操作考试
SQLPLUS执行: 1--@?/rdbms/admin/awrrpt 生产snapshot, 一个时间点, 再执行下一个时间点. 2-- 附件作业第一次执行步骤: 1) SQLP ...
- 给python类动态添加方法(method)
群里有人问如何做到 def foo(): pass class Bar(object): pass Bar.set_instance_method(foo) b = Bar() b.foo() 这个其 ...
- ASP.NET 优化 check list
看到一个蛮有意思的网站,里面有针对asp.net方方面面优化的罗列: 点击打开链接http://webdevchecklist.com/asp.net/performance/ 点击打开链接http: ...
- 两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错
遇到了两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错 首先第一个: 在做一个用ajax图片上传的功能中,php报了这样一个错误:File upload error - u ...
- TDirectory.Move移动或更名目录
使用函数: System.IOUtils.TDirectory.Move 定义: class procedure Move(const SourceDirName, DestDirName: stri ...
- 1500: [NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- 集成Facebook和Twitter的Model动画-b
这个动画. 感谢大神分享 JPPopPresentAnimation.gif 要实现这个功能分两步走:第一步,先实现这个动画.第二步,0行代码集成到项目.也就是,你不用改原有项目的任何代码,只要把写 ...
- python is == 的区别
要点: is 判断是否是同一个对象.是通过id来判断的 == 是通过值来判断的 为了提高内存利用率对一些简单的对象,如一些数值较小的int对象,python采用重用对象内存的方法 例如指向 ...