原创 Nginx高級數據結構源碼分析(二)-----動態數組

        ngx_array_t是一個順序容器,它在Nginx中被大量使用。它以數組的形式存儲元素,並支持在達到數組容量的上限動態時改變數組的大小。它類似於C++中的vector容器,而且內置了Nginx封裝的內存池,因此,它分配的

原创 nginx進程間的通信機制源碼分析(二)-------原子操作、自旋鎖、文件鎖

原子操作 原子操作指的是由多步組成的一個操作.如果該操作原子的執行,則要麼執行玩所有步驟,要麼一步也不執行,不可能值執行所有步驟的一個子集. 想要使用原子擦操作來修改,獲取整型變量,自然不能使用加減號,而要使用nginx提供的兩個方法:n

原创 九度 1366 棧的壓入彈出序列

題目描述: 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,

原创 C++ Primer 第(1-3)章一句話知識點總結

          C++ Primer 知識點繁多,容易忘記,故有此總結。需要注意的是許多一句話的規定不要死記硬背,儘量去思考規則背後的原因,便能事半功倍。 (1) endl是一個特殊值,稱爲操作符,將它寫入輸出流時,具有輸出換行的效果

原创 C++封裝互斥量和條件變量

互斥量 (1)互斥量是保護臨界區的另一種方法,當執行線程在臨界區的執行時間很長時,那麼就最好使用互斥量了,否則會造成其他的線程將會在臨界區外忙等,浪費CPU時間;此時其他線程發現臨界區已經被互斥量鎖住,那麼它們將會阻塞;當互斥量被釋放時

原创 C++實現基於單線程單客戶模型的echo程序

        一個客戶一個子線程,也是阻塞式網絡編程,它的初始化要比一個客戶一個進程模型開銷要小;但是仍適合於長連接,不適合短連接、併發數不大的情況,尤其不適合pthread_create()的開銷大於本身服務的情況; 編程模型

原创 <<深度探索c++對象模型>>第一章讀書筆記

1.c++對數據和操作加上封裝後的佈局成本是否增大? 沒有虛函數和虛基類,封裝後的class並沒有增加成本.成員函數歲在class的聲明中,卻不出現在對象中,一個類共享一份代碼.每一個非inline的函數只有一份實例.每一個inline函

原创 nginx高級數據結構源碼分析(一)-----雙向鏈表

ng_queue_t是Nginx提供的一個順序容器,它以雙向鏈表的方式將數據組織在一起。 鏈表作爲順序容器的優勢在於,它可以高效的執行插入、刪除、合併等操作,在移動鏈表中的元素時只需要修改指針的指向,因此,它很適合頻繁修改容器的場合。 相

原创 c++封裝線程池

線程池 ThreadPool聲明 class Thread; class ThreadPool final { public: ThreadPool(const ThreadPool&) = delete;

原创 c++實現基於單進程單客戶編程模型的echo程序

       一個客戶一個子進程,是阻塞式網絡編程,適合於長連接,不適合短連接、併發數不大的情況,尤其不適合fork()的開銷大於本身服務的情況. 編程模型 (1)迭代服務器,TCP迭代服務器總是完全處理完某個客戶的請求之後纔會轉向爲

原创 C++實現基於IO複用模型的echo服務器

       IO複用,即IO multiplexing,是使用select/poll/epoll這一系列的多路選擇器,可使進程或線程能夠處理多個連接;實質上不是複用IO,而是多個IO複用進程或線程; 編程模型 (1)單進程IO複用