一起來寫web server 04

2021-12-29 19:56:56 字數 1196 閱讀 9612

從這個版本開始,後面的**差不多是越來越難啦.

這個版本,我們主要是要實現乙個執行緒池版本的web server.這個版本的設計出自unp.

思想非常簡單,那就是父執行緒首先構建n多子執行緒,這些子執行緒全部爭搶全域性的一把鎖,只有搶到了鎖的執行緒才能夠呼叫accept函式,否則都會阻塞掉.

/*-

* 執行緒池版本的web server.主要的思想是事先構建乙個執行緒池,只是需要注意的是,accept的時候需要加鎖.

*/int listenfd; /* 全域性的乙個監聽套接字 */

mutexlock mutex; /* 全域性的一把鎖 */

int main(int argc, char *ar**)

for ( ; ; )

pause();

return 0;

}void* thread_main(void *arg)

doit(connfd); /* 處理連線 */

close(connfd); /* 關閉連線 */

}}一般涉及到多執行緒的資源共享,鎖或者說互斥,加上乙個同步機制,總是逃不開的話題.

對於共享資源的寫,總是要加鎖的.如何來構造一把鎖呢?我這裡的**參考了muduo庫的設計.

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

class mutexlock : noncopyable

它的建構函式,僅僅是呼叫普通的鎖的初始化的**:

mutexlock()

: holder_(0)

它的析構函式,主要是呼叫鎖的銷毀函式.

~mutexlock()

mutexlock這個類巧妙的利用了cpp類的特性來管理鎖這個資源.

接下來比較重要的是加鎖以及解鎖操作:

void lock()

void unlock()

如何來使用這個鎖呢?muduo庫設計了另外乙個類,叫做mutexlockguard.這個類非常簡單:

class mutexlockguard : noncopyable

~mutexlockguard()

private:

mutexlock& mutex_; /* 持有鎖的乙個引用 */

};通過這個類,我們就可以很方便的實現加鎖和解鎖操作了,我們只需要向之前**裡那樣使用就行了:

在這個中括號包圍的作用域裡,鎖是有效的,出了這個作用域,lock析構了,鎖就解開了,**很漂亮.

shell 清楚空格 一起來寫乙個Shell指令碼吧

說實話,寫指令碼這一塊屬實 業務不精 一來現如今的工具已經比較方便了,二來自己還是比較懶。正巧最近再嘗試公司的雲編譯功能,雖然雲編譯外掛程式自動做了大量的工作,但是最終也只是把產物 apk 拉到本地某檔案目錄下,因此還是需要我們主動要install。因此基於這個場景就像寫乙個指令碼可以一鍵的把拉下的...

手起刀落 一起來寫經典的貪吃蛇遊戲

小時候玩的經典貪吃蛇遊戲我們印象仍然深刻,謀劃了幾天,小時候喜歡玩的遊戲,長大了終於有能力把他做出來 從來都沒有通關過,不知道自己寫的程式,是不是能通關了.好了,閒話不多談,先來看一下效果吧!功能和小時候玩的貪吃蛇一樣,1 選擇速度 slow normal fast 2 選擇是否有牆作為障礙物 on...

一起來點讚

description 小a同學最近接了乙個專案,專案的一部分內容是設計朋友圈模組,他在寫點贊功能的時候遇到了一點麻煩。現在他的資料表裡面有如下內容資訊 zhangsan 1 lisi 2 zhangsan 2 lisi 3 wangwu 1 wangwu 2 wangwu 3 其中每一行的由兩部分...