muduo原始碼筆記 base Timestamp

2021-10-04 00:00:59 字數 3590 閱讀 5050

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

#ifndef muduo_base_timestamp_h

#define muduo_base_timestamp_h

#include

"muduo/base/copyable.h"

#include

"muduo/base/types.h"

#include

namespace muduo

// 使用特定時間的建構函式

explicit

timestamp

(int64_t microsecondssinceepocharg)

:microsecondssinceepoch_

(microsecondssinceepocharg)

// 交換兩個timestamp的值

void

swap

(timestamp& that)

// 使用預設的複製建構函式、賦值運算子、析構函式

// 時間轉換為字串表示

// 例項:1584364560.458500

string tostring()

const

;// 時間轉換為格式化的字串表示

// 例項:20200316 13:16:00

string toformattedstring

(bool showmicroseconds =

true

)const

;// 判斷時間是否有效

bool

valid()

const

// 返回微秒,僅供內部使用

int64_t

microsecondssinceepoch()

const

// 返回秒數(time_t表示的是秒數)

time_t secondssinceepoch()

const

// 獲取當前時間

static timestamp now()

;static timestamp invalid()

// 將time_t(秒)轉換為timestamp格式(微秒)

static timestamp fromunixtime

(time_t t)

static timestamp fromunixtime

(time_t t,

int microseconds)

// 靜態成員變數,每秒多少微秒(10^6)

static

const

int kmicrosecondspersecond =

1000

*1000

;private

:// 微秒數,使用int64_t表示,可以直接存放暫存器,優化讀取時間

int64_t microsecondssinceepoch_;};

// 時間比較操作,由於繼承自less_than_comparable

// 因此需要提供 operator< ,其他 >、<=、>=會自動實現

inline

bool

operator

<

(timestamp lhs, timestamp rhs)

// 時間判等操作,由於繼承自boost::equality_comparable

// 因此需要提供 operator==操作,!=會自動實現

inline

bool

operator

==(timestamp lhs, timestamp rhs)

// 計算兩個時間戳相差的秒數

inline

double

timedifference

(timestamp high, timestamp low)

// 實現時間戳+秒數

inline timestamp addtime

(timestamp timestamp,

double seconds)

}// namespace muduo

#endif

// muduo_base_timestamp_h

#include

"muduo/base/timestamp.h"

#include

// time_t,gtime_r,gettimeofday

#include

#ifndef __stdc_format_macros

#define __stdc_format_macros

#endif

// 跨平台的書寫方式,主要是為了同時支援32位和64位作業系統。

// prid64表示64位整數,在32位系統中表示long long int,在64位系統中表示long int

// 64位即lld,32位即ld

#include

// prid64

using

namespace muduo;

static_assert

(sizeof

(timestamp)

==sizeof

(int64_t),

"timestamp is same size as int64_t");

// 時間轉換為字串表示

string timestamp::

tostring()

const

;int64_t seconds = microsecondssinceepoch_ / kmicrosecondspersecond;

int64_t microseconds = microsecondssinceepoch_ % kmicrosecondspersecond;

snprintf

(buf,

sizeof

(buf)-1

,"%" prid64 ".%06" prid64 ""

, seconds, microseconds)

;return buf;

}// 時間轉換為格式化的字串表示

string timestamp::

toformattedstring

(bool showmicroseconds)

const

; time_t seconds =

static_cast

(microsecondssinceepoch_ / kmicrosecondspersecond)

;// 注意:tm是從2023年起的

struct tm tm_time;

gmtime_r

(&seconds,

&tm_time);if

(showmicroseconds)

else

return buf;

}timestamp timestamp::

now(

)

muduo原始碼筆記 base Atomic

atomic是對整數 int 原子性操作的乙個封裝。使用了gcc原子性操作,效率比普通加鎖要高。這裡主要是使用了三個函式 1 原子自增操作 將 ptr加上value,並返回 ptr原來的值 type sync fetch and add type ptr,type value 2 原子和比較操作 如...

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 ...