muduo原始碼筆記 base Atomic

2021-10-04 00:09:24 字數 1938 閱讀 1760

atomic是對整數 int 原子性操作的乙個封裝。使用了gcc原子性操作,效率比普通加鎖要高。這裡主要是使用了三個函式:

(1) 原子自增操作

將*ptr加上value,並返回*ptr原來的值

type __sync_fetch_and_add

(type *ptr, type value)

(2) 原子和比較操作

如果*ptr的值與oldval的值相等,則設定為newval,並返回oldval

type __sync_val_compare_and_swap

(type *ptr, type oldval type newval)

(3) 原子賦值操作

將*ptr設定為value並且返回*ptr原來的值

type __sync_lock_test_and_set

(type *ptr, type value)

#ifndef muduo_base_atomic_h

#define muduo_base_atomic_h

#include

"muduo/base/noncopyable.h"

#include

namespace muduo

// uncomment if you need copying and assignment

//// atomicintegert(const atomicintegert& that)

// : value_(that.get())

// {}

//// atomicintegert& operator=(const atomicintegert& that)

// //

t get()

t getandadd

(t x)

t addandget

(t x)

t incrementandget()

t decrementandget()

void

add(t x)

void

increment()

void

decrement()

t getandset

(t newvalue)

private

:volatile t value_;};

}// namespace detail

typedef detail::atomicintegert<

int32_t

> atomicint32;

typedef detail::atomicintegert<

int64_t

> atomicint64;

}// namespace muduo

#endif

// muduo_base_atomic_h

注意:getandadd() 返回的是舊值,addandget() 返回的是增加之後的值。

volate關鍵字的作用是:告訴編譯器不要優化**,每次都要從記憶體中讀取資料(防止讀取舊的快取)。

測試:

#include

#include

"atomic.h"

using

namespace std;

using

namespace muduo;

intmain()

輸出為:

num: get() 0

num: getandadd() 0

num: addandget() 2

muduo原始碼筆記 base Timestamp

timestamp表示的是utc時間,最小可表示微秒 us 資料成員microsecondssinceepoch 使用int64 t long long 表示物件,因此作者建議將此值按值傳遞,這樣可以直接存放在暫存器中,提高訪問速度。ifndef muduo base timestamp h def...

muduo原始碼筆記 base Mutex

mutexlock類是對互斥量的封裝,使用棧上物件mutexlockguard來管理mutex的加鎖與釋放。棧上物件在退出對應的 段之後會自動釋放,隨之,鎖也會被自動釋放。使用方法如下 class foo int foo size const mutex.h的部分原始碼如下所示 class capa...

讀Muduo原始碼筆記 1

物件銷毀時出現的競態條件 執行緒安全的類 簡單的執行緒安全類 class counter int value const int getandincrease private int value mutable mutexlock mutex int counter value const int ...