zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    201521044091《Java程序设计》第7周学习总结
    201521044091《java程序设计》第四次总结
    201521044091 《java程序设计》第八周学习总结
    201521044091 《Java程序设计》第5周学习总结
    201521044091 《Java程序设计》第2周学习总结
    201521044091 《Java程序设计》第3周学习总结
    MySQL设置字符集CHARACTER SET
    Create My MySQL configuration by Percona
    How to use jQuery to manipulate Cookies
    How to use OpenXml to import xml data to Sql server
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/14696698.html
Copyright © 2011-2022 走看看