多執行緒程式設計在任何語言中基本都是乙個繞不開的話題,如果我們想要發揮計算機多核的優勢,提高程式的響應速度,就一定要使用到多執行緒程式設計技術。因此muduo庫一定少不了thread的封裝,接下來我們開始學習muduo庫thread類的封裝。
如果讓我自己設計乙個thread類的話我能想到的有哪些:
上面是我能想到的自己設計乙個執行緒類時應該有的屬性,我們再看看muduo庫的執行緒比我自己想到多了哪些
thread.h
// use of this source code is governed by a bsd-style license
// that can be found in the license file.
//// author: shuo chen (chenshuo at chenshuo dot com)
#ifndef muduo_base_thread_h
#define muduo_base_thread_h
#include "muduo/base/atomic.h"
#include "muduo/base/countdownlatch.h"
#include "muduo/base/types.h"
#include #include #include namespace muduo
// pthread_t pthreadid() const
pid_t tid() const
const string& name() const
static int numcreated()
private:
void setdefaultname();
bool started_;
bool joined_;
pthread_t pthreadid_;
pid_t tid_;
threadfunc func_;
string name_;
countdownlatch latch_;
static atomicint32 numcreated_;
};} // namespace muduo
#endif // muduo_base_thread_h
muduo庫thread類的設計:
上面這是通過對muduo執行緒類標頭檔案我在第一時間沒有能想到的點,上面這些點雖然有些我沒能想到,但是也和需求有一定的關係,但是其中pid_t這個點的話是屬於知識盲區,以前是不知道可以通過系統呼叫獲取執行緒的程序id(每個執行緒唯一)。
接下來我們學習muduo庫thread.cc,看看執行緒的實現
thread.cc
// use of this source code is governed by a bsd-style license
// that can be found in the license file.
//// author: shuo chen (chenshuo at chenshuo dot com)
#include "muduo/base/thread.h"
#include "muduo/base/currentthread.h"
#include "muduo/base/exception.h"
#include "muduo/base/logging.h"
#include #include #include #include #include #include #include #include namespace muduo
void afterfork()
class threadnameinitializer
};threadnameinitializer init;
struct threaddata
void runinthread()
catch (const exception& ex)
catch (const std::exception& ex)
catch (...)
}};void* startthread(void* obj)
} // namespace detail
void currentthread::cachetid()
}bool currentthread::ismainthread()
void currentthread::sleepusec(int64_t usec)
; ts.tv_sec = static_cast(usec / timestamp::kmicrosecondspersecond);
ts.tv_nsec = static_cast(usec % timestamp::kmicrosecondspersecond * 1000);
::nanosleep(&ts, null);
}atomicint32 thread::numcreated_;
thread::thread(threadfunc func, const string& n)
: started_(false),
joined_(false),
pthreadid_(0),
tid_(0),
func_(std::move(func)),
name_(n),
latch_(1)
thread::~thread()
}void thread::setdefaultname()
}void thread::start()
else }
int thread::join()
} // namespace muduo
檢視muduo庫thread.cc我們發現**分為兩部分,detail命名空間部分是實現是用的一些全域性函式和資料結構,thread::部分是執行緒成員函式的實現,我們的學習也分為兩部分。
detail部分:
afterfork()
threadnameinitializer初始化類
class threadnameinitializer
};threadnameinitializer init;
cachetid函式,通過該函式,每個執行緒的那幾個全域性變數就不用每次都去獲取,因為獲取執行緒的程序id是系統呼叫,相對來說比較費時,這樣可以提高效率
ismainthread通過執行緒的pid和程序的pid做比較如果相同說明是主線程
執行緒成員函式的實現部分
muduo庫分析 base篇(4) Thread
執行緒管理物件,本身攜帶程序tid,需要執行的函式 標頭檔案 typedef boost functionthreadfunc 無引數無返回執行緒函式 explicit thread const threadfunc const string name string 別名防止拷貝函式 countdo...
muduo 日誌庫學習 二
logfile類和asynclogging類各有自己的buffer 在下文中,分別記為file buffer和async buffer 當使用者使用log 寫入日誌內容時,將會把日誌內容寫入到async buffer中,當async buffer寫滿了,就會把async buffer中的內容寫入到f...
muduo 日誌庫學習 一
大佬部落格 muduo的日誌庫由logstream logging logfile asynclogging組成。這裡主要說明一下,這些檔案 主要是檔案裡面對應的類 之間是怎麼關聯,並協同工作的。logstream類裡面有乙個buffer成員 乙個模板類,並非muduo buffer類 該類主要負責...