一起來寫web server 04 -- 線程池版本


從這個版本開始,后面的代碼差不多是越來越難啦.

這個版本,我們主要是要實現(xiàn)一個線程池版本的web server.這個版本的設(shè)計出自UNP.

思想

思想非常簡單,那就是父線程首先構(gòu)建n多子線程,這些子線程全部爭搶全局的一把鎖,只有搶到了鎖的線程才能夠調(diào)用accept函數(shù),否則都會阻塞掉.

代碼

/*- 
* 線程池版本的web server.主要的思想是事先構(gòu)建一個線程池,只是需要注意的是,accept的時候需要加鎖.
*/

int listenfd; /* 全局的一個監(jiān)聽套接字 */
MutexLock mutex; /* 全局的一把鎖 */

int main(int argc, char *argv[])
{
    listenfd = Open_listenfd(8080); /* 8080號端口監(jiān)聽 */
    //signal(SIGPIPE, SIG_IGN); 

    pthread_t tids[10];
    void* thread_main(void *);

    for (int i = 0; i < 10; ++i) {
        int *arg = (int *)Malloc(sizeof(int)); /* 這個東西不會共享 */
        *arg = i;
        Pthread_create(&tids[i], NULL, thread_main, (void *)arg);
    }
    for ( ; ; )
        pause(); 
    return 0;
}

void* thread_main(void *arg)
{
    printf("thread %d starting\n", *(int*)arg);
    Free(arg);
    struct sockaddr cliaddr;
    socklen_t clilen;
    int connfd;
    while (true) {
        {
            MutexLockGuard lock(mutex); /* 加鎖 */
            connfd = Accept(listenfd, &cliaddr, &clilen);
        }
        doit(connfd); /* 處理連接 */
        close(connfd); /* 關(guān)閉連接 */
    }
}

一般涉及到多線程的資源共享,鎖或者說互斥,加上一個同步機制,總是逃不開的話題.
對于共享資源的寫,總是要加鎖的.如何來構(gòu)造一把鎖呢?我這里的代碼參考了muduo庫的設(shè)計.

我們一起來看一下MutexLock這個類.

class MutexLock : noncopyable
{
    private:
        pthread_mutex_t mutex_; /* 這是系統(tǒng)定義的鎖的類型 */
        pid_t holder_; /* 記錄擁有線程的id */
     ...
}

它的構(gòu)造函數(shù),僅僅是調(diào)用普通的鎖的初始化的代碼:

MutexLock()
        : holder_(0)
    {
        pthread_mutex_init(&mutex_, NULL); /* 初始化 */
    }

它的析構(gòu)函數(shù),主要是調(diào)用鎖的銷毀函數(shù).

~MutexLock()
    {
        assert(holder_ == 0);
        pthread_mutex_destroy(&mutex_); /* 銷毀鎖 */
    }

MutexLock這個類巧妙的利用了CPP類的特性來管理鎖這個資源.
接下來比較重要的是加鎖以及解鎖操作:

void lock()
    {
        MCHECK(pthread_mutex_lock(&mutex_));
        assignHolder(); /* 指定擁有者 */
    }

    void unlock()
    {
        unassignHolder(); /* 丟棄擁有者 */
        MCHECK(pthread_mutex_unlock(&mutex_));
    }

如何來使用這個鎖呢?muduo庫設(shè)計了另外一個類,叫做MutexLockGuard.這個類非常簡單:

class MutexLockGuard : noncopyable
{
public:
    explicit MutexLockGuard(MutexLock& mutex)
        : mutex_(mutex)
    {
        mutex_.lock(); /* 構(gòu)造時加鎖 */
    }
    ~MutexLockGuard()
    {
        mutex_.unlock(); /* 析構(gòu)時解鎖 */
    }
private:
    MutexLock& mutex_; /* 持有鎖的一個引用 */
};

通過這個類,我們就可以很方便的實現(xiàn)加鎖和解鎖操作了,我們只需要向之前代碼里那樣使用就行了:

{
    MutexLockGuard lock(mutex); /* 加鎖 */
    ...do other thing...
}

在這個中括號包圍的作用域里,鎖是有效的,出了這個作用域,lock析構(gòu)了,鎖就解開了,代碼很漂亮.

總結(jié)

好了,這個版本的代碼就是這樣啦,感興趣的同學(xué)可以到這里來查看代碼:
https://github.com/lishuhuakai/Spweb

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枚驻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子株旷,更是在濱河造成了極大的恐慌再登,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晾剖,死亡現(xiàn)場離奇詭異锉矢,居然都是意外死亡,警方通過查閱死者的電腦和手機齿尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門沽损,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人循头,你說我怎么就攤上這事绵估。” “怎么了卡骂?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵国裳,是天一觀的道長。 經(jīng)常有香客問我全跨,道長缝左,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任浓若,我火速辦了婚禮渺杉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘七嫌。我一直安慰自己少办,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布诵原。 她就那樣靜靜地躺著英妓,像睡著了一般挽放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔓纠,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天辑畦,我揣著相機與錄音,去河邊找鬼腿倚。 笑死纯出,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的敷燎。 我是一名探鬼主播暂筝,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼硬贯!你這毒婦竟也來了焕襟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饭豹,失蹤者是張志新(化名)和其女友劉穎鸵赖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拄衰,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡它褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翘悉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片家夺。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡杨名,死狀恐怖梁丘,靈堂內(nèi)的尸體忽然破棺而出停蕉,到底是詐尸還是另有隱情棕孙,我是刑警寧澤痹束,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布雄坪,位于F島的核電站驱犹,受9級特大地震影響砖瞧,放射性物質(zhì)發(fā)生泄漏息堂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一块促、第九天 我趴在偏房一處隱蔽的房頂上張望荣堰。 院中可真熱鬧,春花似錦竭翠、人聲如沸振坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渡八。三九已至啃洋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屎鳍,已是汗流浹背宏娄。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逮壁,地道東北人孵坚。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像窥淆,于是被迫代替她去往敵國和親卖宠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容