• muduo 库解析之七:Atomic


    _sync

    Gcc 4.1.2 版本之后,对 X86 或 X86_64 支持内置原子操作。

    //@ 将value加到*ptr上,结果更新到*ptr,并返回操作之前*ptr的值
    type __sync_fetch_and_add (type *ptr, type value, ...)
    //@ 从*ptr减去value,结果更新到*ptr,并返回操作之前*ptr的值
    type __sync_fetch_and_sub (type *ptr, type value, ...)
    //@ 将*ptr与value相或,结果更新到*ptr, 并返回操作之前*ptr的值
    type __sync_fetch_and_or (type *ptr, type value, ...)
    //@ 将*ptr与value相与,结果更新到*ptr,并返回操作之前*ptr的值
    type __sync_fetch_and_and (type *ptr, type value, ...)
    //@ 将*ptr与value异或,结果更新到*ptr,并返回操作之前*ptr的值
    type __sync_fetch_and_xor (type *ptr, type value, ...)
    //@ 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之前*ptr的值
    type __sync_fetch_and_nand (type *ptr, type value, ...)
    
    //@ 将value加到*ptr上,结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_add_and_fetch (type *ptr, type value, ...)
    //@ 从*ptr减去value,结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_sub_and_fetch (type *ptr, type value, ...)
    //@ 将*ptr与value相或, 结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_or_and_fetch (type *ptr, type value, ...)
    //@ 将*ptr与value相与,结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_and_and_fetch (type *ptr, type value, ...)
    //@ 将*ptr与value异或,结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_xor_and_fetch (type *ptr, type value, ...)
    //@ 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之后新*ptr的值
    type __sync_nand_and_fetch (type *ptr, type value, ...)
    
    //@ 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回true
    bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
    //@ 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回操作之前*ptr的值
    type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
    
    //@ 发出完整内存栅栏
    __sync_synchronize (...)
    
    //@ 将value写入*ptr,对*ptr加锁,并返回操作之前*ptr的值。即,try spinlock语义
    type __sync_lock_test_and_set (type *ptr, type value, ...)
    
    //@ 将0写入到*ptr,并对*ptr解锁。即,unlock spinlock语义
    void __sync_lock_release (type *ptr, ...)
    

    源码

    Atomic.h

    #pragma once
    
    #include <stdint.h>
    
    #include "NonCopyable.h"
    
    namespace muduo
    {
        namespace detail
        {
            template <typename T>
            class AtomicInteger : NonCopyable
            {
            public:
                AtomicInteger() : val_(0) {}
    
                T get()
                {
                    // in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)
                    return __sync_val_compare_and_swap(&val_, 0, 0);
                }
    
                T get_and_add(T x)
                {
                    // in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)
                    return __sync_fetch_and_add(&val_, x);
                }
    
                T add_and_get(T x)
                {
                    return get_and_add(x) + x;
                }
    
                T increment_and_get()
                {
                    return add_and_get(1);
                }
    
                T decrement_and_get()
                {
                    return add_and_get(-1);
                }
    
                void add(T x)
                {
                    get_and_add(x);
                }
    
                void increment()
                {
                    increment_and_get();
                }
    
                void decrement()
                {
                    decrement_and_get();
                }
    
                T get_and_set(T newValue)
                {
                    // in gcc >= 4.7: __atomic_exchange_n(&value_, newValue, __ATOMIC_SEQ_CST)
                    return __sync_lock_test_and_set(&val_, newValue);
                }
    
            private:
                T val_;
            };
        }
    
        //@ 预定义两个常用的类型
        typedef detail::AtomicInteger<int32_t> AtomicInt32;
        typedef detail::AtomicInteger<int64_t> AtomicInt64;
    } // namespace muduo
    
  • 相关阅读:
    第三章web安全基础—IIS发布网站(其中包括服务器IIS搭建、DNS搭建)
    第三章web安全基础—web系统架构
    第二章网络协议安全—网络协议看安全
    第一章信息收集—漏洞利用框架metasploit基本实用
    第一章信息收集—漏洞扫描awvs和appscan
    第一章信息收集—扫描技术与抓包分析
    Pikachu——Unsafe Fileupload不安全文件上传
    Pikachu——Unsafe Filedownload 不安全的文件下载
    Pikachu——File Inclusion(文件包含)
    拿什么拯救你,红果果的小磁盘?
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/14696698.html
Copyright © 2020-2023  润新知