muduo網路庫學習之Timestamp類、AtomicIntegerT 類封裝中的知識點
一、Timestamp類封裝
class Timestamp :
public muduo::copyable,
public boost::less_than_comparable<Timestamp>
類圖如下:
public boost::less_than_comparable<Timestamp>
值語義:可以拷貝,拷貝之後,與原物件脫離關係
物件語義:要麼是不能拷貝;要麼可以拷貝,拷貝之後與原物件仍然存在一定的關係,比如共享底層資源
兩者之間的關係參見這裡。
1、muduo::copyable 空基類,標識類,值型別
2、less_than_comparable<Timestamp> 模板類
Timestamp 要求實現<, =,可自動實現>,<=,>=
3、成員 microSecondsSinceEpoch_ 是現在這個時刻距離1970-01-01 00:00:00 (UTC 時間) 的微秒數
4、BOOST_STATIC_ASSERT 編譯時斷言
assert 執行時斷言
5、使用PRld64
int64_t 用來表示64位整數,在32位系統中是long long int,在64位系統中是long int,所以列印int64_t的格式化方法是:
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
跨平臺的做法:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
跨平臺的做法:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
二、AtomicIntegerT 類封裝
template<typename T>
class AtomicIntegerT : boost::noncopyable
class AtomicIntegerT : boost::noncopyable
類圖如下:
1、為什麼需要原子性操作?
x++; (x是共享變數)
從記憶體中讀x的值到暫存器中,對暫存器加1,再把新值寫回x所處的記憶體地址
(1)、假設是多核(multiprocessors)的情況,x 的初始值為5:
因為每個核都有自己獨立的暫存器,兩個執行緒同時訪問可能出現只加了一次的情況。
(2)、假設是單核的情況:
例如有兩個執行緒,它們按照如下順序執行(注意讀x和寫回x是原子操作,兩個執行緒不能同時執行(偽併發),是分時實現):
time Thread 1 Thread 2
load eax, x
load eax, x
add eax, 1
add eax, 1
store x, eax
store x, eax
我們會發現最終x的值會是1而不是2,Thread 1的結果被覆蓋掉了,因為Thread2在進行++之前以為x還是0,而不是1(每個執行緒都儲存自己的上下文包括暫存器的值,重新排程回Thread2時eax被載入為原來儲存的0)。
這種情況下我們就需要對x++這樣的操作加鎖(例如Pthread中的mutex)以保證同步,或者使用一些提供了atomic operations的庫,linux下的如atomic.h,下面會介紹部分函式。
2、gcc 原子性操作
// 原子自增操作
type __sync_fetch_and_add (type *ptr, type value)
type __sync_fetch_and_add (type *ptr, type value)
type tmp = *ptr;
*ptr += value;
return tmp;
// 原子比較和設定操作
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval)
// 原子比較和設定操作
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval)
if (*ptr == oldval)
{
}*ptr = newvalreturn oldval;
else
return *ptr;
bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval)
if (*ptr == oldval)
{
}*ptr = newval;return true;
else
return false;
// 原子賦值操作
type __sync_lock_test_and_set (type *ptr, type value)
type tmp = *ptr;
*ptr = value;
return tmp;
使用這些原子性操作,編譯的時候需要加-march=cpu-type 或者 -march = native
3、volatile 關鍵字
volatile的作用: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。簡單地說就是防止編譯器對程式碼進行優化。當要求使用volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,而不是使用儲存在暫存器中的備份。即使它前面的指令剛剛從該處讀取過資料,而且讀取的資料立刻被儲存。
補充:gcc/g++ 一些編譯選項
-Wall // 大部分警告
-Wextra // 一些額外的警告
-Werror // 當出現警告時轉為錯誤,停止編譯。(對應 -Wno-error)
-Wconversion // 一些可能改變值的隱式轉換,給出警告。
-Wno-unused-parameter // 函式中出現未使用的引數,不給出警告。
-Wold-style-cast // C風格的轉換,給出警告
-Woverloaded-virtual // 如果函式的宣告隱藏住了基類的虛擬函式,就給出警告。
-Wpointer-arith // 對函式指標或者void *型別的指標進行算術操作時給出警告
-Wshadow // 當一個區域性變數遮蓋住了另一個區域性變數,或者全域性變數時,給出警告。
-Wextra // 一些額外的警告
-Werror // 當出現警告時轉為錯誤,停止編譯。(對應 -Wno-error)
-Wconversion // 一些可能改變值的隱式轉換,給出警告。
-Wno-unused-parameter // 函式中出現未使用的引數,不給出警告。
-Wold-style-cast // C風格的轉換,給出警告
-Woverloaded-virtual // 如果函式的宣告隱藏住了基類的虛擬函式,就給出警告。
-Wpointer-arith // 對函式指標或者void *型別的指標進行算術操作時給出警告
-Wshadow // 當一個區域性變數遮蓋住了另一個區域性變數,或者全域性變數時,給出警告。
-Wwrite-strings // 規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-const char *指標將產生警告.
這些警告能夠幫助你在編譯期間發現企圖寫入字串常量 的程式碼
-march=native // 指定cpu體系結構為本地平臺
相關文章
- muduo網路庫Timestamp類
- muduo網路庫AtomicIntegerT原子整數類
- muduo網路庫Exception異常類Exception
- 靜態庫封裝之ComDir類封裝
- 靜態庫封裝之ComFile類封裝
- 靜態庫封裝之ComStr類封裝
- muduo網路庫編譯安裝編譯
- Laravel 小知識點之 HtmlString 類LaravelHTML
- 學習網路安全能掌握哪些知識點?網路安全技術學習
- 【入門知識】網路安全中的漏洞分為哪幾類?
- Android之Activity基類封裝Android封裝
- Retrofit+okhttp+Rxjava封裝網路請求工具類HTTPRxJava封裝
- JavaSE基礎知識學習—–抽象類和介面Java抽象
- VR垃圾分類體驗系統:學習垃圾分類知識科普VR
- 一、類的封裝性封裝
- 通過Handler封裝的網路請求資料的工具類NetUtils封裝
- educoder上的實訓題目(學習-Java包裝類之Byte類)Java
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- Java類和物件知識點總結Java物件
- 封裝Redis工具類封裝Redis
- 封裝Date工具類封裝
- 網路安全都學哪些課程?網路安全知識學習
- 十五、類與封裝的概念封裝
- muduo原始碼解析11-logger類原始碼
- 網路安全學習中,原始碼審計有哪些分類?原始碼
- 類載入、物件例項化知識點一網打盡物件
- C/C++ Zlib庫封裝MyZip壓縮類C++封裝
- 使用C++/CLI呼叫C#封裝類庫C++C#封裝
- 如何講清楚 Java 物件導向的問題與知識?(類與物件,封裝,繼承,多型,介面,內部類...)Java物件封裝繼承多型
- 4、類和物件—封裝物件封裝
- 自用驗證類封裝封裝
- c#封裝DBHelper類C#封裝
- 學習網路BGP必備基礎知識
- 學習記錄 -- 知識點
- RxHttp - 輕量級、可擴充套件、易使用、完美相容MVVM、MVC架構的網路封裝類庫HTTP套件MVVMMVC架構封裝
- 網路安全基礎知識入門!網路安全學習教程
- 網路安全的優點是什麼?網路安全都學什麼知識
- 安全都有哪些基本分類?網路安全知識有哪些
- 計算機網路知識點計算機網路