天天看點

PF2.1版本總結,在設計過程中遇到的問題以及技術分享

  在距離上一次的版本釋出已經過去4個月的時間,因為個人的能力以及時間有限,是以這次的版本會推遲這麼久。可是無論怎樣,PF2.1帶着自身的完善總算不負所望推出。在這次的版本調整中讓我深有體會到了程式設計中的幾大問題:安全、性能、穩定。如何設計出一個高效穩定的架構時,自然需要對所運用的語言的熟知,在這期間我一直參考了《effective c++》這本對C++語言總結的十分詳細的資料,結合了最新C++11的新特性。

版本更新

  1、增加:cache子產品

  2、增加:lua插件中的dcache子產品

  3、增加:對應的windows專用版本倉庫

  4、優化:利用C++11新特性修改basic的type::variable_t的實作機制

  5、優化:動态配置設定記憶體類修改、替換資料庫查詢中的結果緩存資料為堆的實作方式(之前棧的方式會導緻windows棧溢出)

  6、修複:share::Map、share::lock/unlock、db::Query在多線程不能正常工作的問題

  在這次的版本中遇到的最多問題是多線程下以及windows平台上相容的問題,深刻體會到VC的實作與GNU的差別。雖然平台之間存在相容性,可是一些硬性的C++标準是不會有什麼差別的。對于存在的問題,該版本進行了大刀闊斧的修正,絕對沒有存在任何僥幸和姑息。我将從以下幾個方面來分享:共享鎖、泛型程式設計、線程池。

共享鎖

  共享鎖的實作目的是為了在同時通路這些公用的記憶體時資料的正确性,這與多線程中的鎖是類似的。不過共享鎖的實作是以std::atomic的CAS(compare_exchange_weak)方式實作的,這方面可以查詢一下相關的資料,當然這是在C++11标準中的,舊的标準沒有。

  在pf_cache::DbStore以及核心的share::Map中我都用到了共享鎖,目前這個共享鎖的實作可能并不完美,不過在測試下可以進行正常的工作。

  std::atomic的資料是在共享記憶體中存在的,是以在我們隊單個對象節點(node)進行操作時需要保證它是被正确修改的,即鎖的本身需要保證安全和可靠。同時最重要一點的是我們再進行一個整體操作時,比如share::Map中删除一個資料需要涉及到内部記憶體的變動,那麼這整個改變應該是唯一的,是以在這過程中我們需要全程加鎖,避免另一個删除操作(多線程)修改我們這些資料,導緻操作記憶體的混亂錯誤。

泛型程式設計

  什麼是泛型程式設計?

  我們要了解它的含義,那麼我們可以看一個類型,那就是void *,它表示什麼意思呢?我們可以稱它為空指針,同時它還有另一個名字:泛型指針。

  為什麼void *被叫做泛型指針呢?想想我們用它的場景,應該不難發現,它的最大作用時表示任何的指針,它可以很輕松的轉換為你想要的類型,是以它本身是與類型沒有任何關系的。

  泛型程式設計和void *指針一樣,它本身是和類型無關的,原則上是通用的。而在C++中的實作方式,是以類(結構體)和函數模闆(template)的方式。

  本次版本中就使用了模闆的方式重構了type::variable_struct,從原來約1500行代碼縮短到約600行,這可見泛型程式設計的優越。

  不過在模闆中我覺得需要注意的是模闆特化的實作方式,這一點可以查找相關資料即可。

線程池

  提到池的概念,有許多人可能會想到記憶體池,這是因為我們在學習過程中許多書籍上都會有相關的介紹。線程池的概念卻有些差別,雖然它也是一個相當于存儲許多線程的容器,不過我認為它更像一個工作小組。

  我們之是以要用到多線程和線程池的原因,就是為了充分利用機器的線程優勢,就好比原來隻有一個人做的工作,現在分攤到許多人的身上,自然這樣的工作效率是成倍的提升的。而PF現在的線程池在類pf_sys::ThreadPool中,是一位開源貢獻者實作的。它利用了C++的新特性,線上程池構造時便建立了許多的工作線程,并讓它們進入休眠中,當有一個新的任務時,它會利用線程條件通知的方式喚醒線程進行工作。

  在pf_cache::DbStore中的waitquery便使用了線程池,有興趣的可以去檢視,自然也歡迎大家能指正錯誤。

附錄

  github for linux:  https://github.com/viticm/plainframework

  github for windows: https://github.com/viticm/pf_win

  讨論QQ群: 348477824

作者:viticm

出處: http://www.cnblogs.com/lianyue/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步麼?那就【關注】我吧。

繼續閱讀