muduo庫學習篇 Thread類學習

2021-09-23 22:37:47 字數 3237 閱讀 5487

多執行緒程式設計在任何語言中基本都是乙個繞不開的話題,如果我們想要發揮計算機多核的優勢,提高程式的響應速度,就一定要使用到多執行緒程式設計技術。因此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類 該類主要負責...