Muduo源码分析(2):原子类
来源:互联网 发布:在淘宝见过最污的东西 编辑:程序博客网 时间:2024/06/09 16:11
原子性操作:
不会被线程调度机制打断的操作,效率高于锁操作Muduo封装的gcc原子操作函数:
// 如果*ptr == oldval,就将newval写入*ptr,然后返回*ptr// 否则直接返回*ptr__sync_val_compare_and_swap(type *ptr, type oldval type newval, ...)// 返回修改前的值__sync_fetch_and_add(type *ptr, type value, ...) // 将*ptr设为value并返回*ptr操作之前的值。__sync_lock_test_and_set(type *ptr, type value, ...)
相对应的gcc>=4.7的版本中:
__atomic_load_n
__atomic_fetch_add
__atomic_store_n
template<typename T>class AtomicIntegerT : noncopyable{ public: AtomicIntegerT(): value_(0){} T get() { // 返回*value实际的值 return __sync_val_compare_and_swap(&value_, 0, 0); T getAndAdd(T x) { // 1.获取*value的值;2.*value+x;3.返回*value原先的值 return __sync_fetch_and_add(&value_, x); } T getAndSet(T newValue) { // 1.获取*value,2. *value=newValue 3. return *value原先的值 return __sync_lock_test_and_set(&value_, newValue); } T addAndGet(T x) { // 与getAndAdd(T x)相比,相当于返回*value+x后的值 return getAndAdd(x) + x; } T incrementAndGet() { // 相当于++i return addAndGet(1); } T decrementAndGet() { // 相当于--i return addAndGet(-1); } void add(T x) { // 相当于i++ getAndAdd(x); } void increment() { incrementAndGet(); } void decrement() { decrementAndGet(); } private: volatile T value_;};typedef AtomicIntegerT<int32_t> AtomicInt32;typedef AtomicIntegerT<int64_t> AtomicInt64;
变量value使用volatile修饰:
volatile修饰的变量,系统总是重新到改变量的内存重新读取数据,而不是去寄存器中读取该变量的备份数据,去除编译器对改该变量的优化处理。
阅读全文
0 0
- Muduo源码分析(2):原子类
- muduo源码分析:数值原子类封装和gcc提供的原子性操作
- muduo源码分析2:整体框架
- muduo-源码分析(前言0)
- muduo源码分析(1):时间类
- muduo源码分析---EventLoopThread
- muduo源码分析--TcpServer
- muduo库源码分析
- muduo源码分析--详解muduo多线程模型
- ContentProvider源码分析(原)
- ContentProvider源码分析(原)
- ContentProvider源码分析(原)
- muduo源码分析---EventLoop类
- muduo源码分析--EventLoopThreadPool类
- muduo源码分析--数据发送
- muduo源码分析:ThreadLocalSigleton类
- muduo源码分析之EventLoop
- muduo源码分析之Acceptor
- Aspose.cell 导出到Excell 模板(带图片)
- android studio编译提示it is possible that this issue is resolved by uninstalling an....
- java 通过itext 创建pdf 添加,插入 表格,html格式
- 算法竞赛入门经典 第二版 习题5-15 Fibonacci的复仇 Revenge of Fibonacci uva12333
- ionic中的ToastController小弹窗用法。提示信息。toast长时间不消失解决方案
- Muduo源码分析(2):原子类
- 命令行参数,main函数带参数的使用
- [iOS]终极横竖屏切换解决方案
- POJ-1611 ----The Suspects
- 电设——开关电源——LM2596
- android 获取手机网络状态
- pandas 如何分割字符
- exercise8补充
- Lumen控制器调用Model层方法并访问数据库时发生错误