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