最新在讀muduo原始碼,想寫乙個原始碼閱讀的系列,就以這個為開篇吧
原始碼如下:
templateclass atomicintegert : noncopyable
// 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::atomicintegertatomicint32;
typedef detail::atomicintegertatomicint64;
其中主要介面只有幾個,第乙個是get,是使用__sync_val_compare_and_swap實現的,該函式的功能如下:
//type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
// 比較*ptr與oldval的值,如果兩者相等,則將newval更新到*ptr並返回操作之前*ptr的值
所以 原始碼中__sync_val_compare_and_swap(&value_, 0, 0)的意思就是如果value_為0,則賦值為0,其實什麼都沒有改變,但是最後會返回value的值,所以實現了get功能。
第二個是getandadd,使用__sync_fetch_and_add實現,該函式的功能如下:
//type __sync_fetch_and_add (type *ptr, type value, ...)
// 將value加到*ptr上,結果更新到*ptr,並返回操作之前*ptr的值
所以getandadd實現的功能就是先將value_加x,然後返回加x之前的value_。
第三個就是getandset,使用__sync_lock_test_and_set實現,該函式的功能如下:
//type __sync_lock_test_and_set (type *ptr, type value, ...)
// 將value寫入*ptr,對*ptr加鎖,並返回操作之前*ptr的值。
getandset實現的功能就是使用newvalue修改value_的值,並返回修改之前的value_。
其他的所有介面都是使用上面的幾個介面間接實現的,都很好理解。
gcc內建的原子操作還有很多,從某個地方抄了一些,不記得在哪抄的了,如果有問題之後再修改吧,現在先放在這裡。
//type __sync_fetch_and_add (type *ptr, type value, ...)
// 將value加到*ptr上,結果更新到*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, ...)
// 將*ptr取反後,與value相與,結果更新到*ptr,並返回操作之前*ptr的值
//type __sync_add_and_fetch (type *ptr, type value, ...)
// 將value加到*ptr上,結果更新到*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取反後,與value相與,結果更新到*ptr,並返回操作之後新*ptr的值
//bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
// 比較*ptr與oldval的值,如果兩者相等,則將newval更新到*ptr並返回true
//type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
// 比較*ptr與oldval的值,如果兩者相等,則將newval更新到*ptr並返回操作之前*ptr的值
///__sync_synchronize (...)
// 發出完整記憶體柵欄
//type __sync_lock_test_and_set (type *ptr, type value, ...)
// 將value寫入*ptr,對*ptr加鎖,並返回操作之前*ptr的值。即,try spinlock語義
//void __sync_lock_release (type *ptr, ...)
// 將0寫入到*ptr,並對*ptr解鎖。即,unlock spinlock語義
centos下Muduo庫的安裝
git clone2.在安裝muduo之前我們需要先安裝boost庫和cmake工具,muduo有三個非必要依賴庫,curl,c areas dns,google protobuf,這三個庫安裝之後,cmake會自動編譯出多一些例項。cmake安裝 3.進入muduo庫根目錄分別執行 build.s...
muduo的高效能非同步日誌
1 乙個日誌庫大體可分為前端 frontend 與後端 backend 前端是 用程式使用的介面 api 並生成日誌資訊 後端則是負責將日誌資訊寫到目的地。每個執行緒都有自己的前端,而整個程式共用乙個後端。對於生產者 前端 而言,要盡量做到低延遲 低cpu開銷 無阻塞 對消費者 後端 而言,要盡量做...
用muduo實現memcached協議的例子
最近花了兩天時間用 muduo 部分實現了 memcached 伺服器協議,位於 examples memcached server,能通過 memcached 的大部分測試用例 incr decr 還沒有實現 這不是 memcached 的替代品 它沒有實現lru和超時功能,也沒有實現二進位制協議...