ascs 簡明開發教程(十二):查詢優化、消息隊列優化

QQ交流羣:198941541

查詢顯然是容器上的操作,所以這裏說的查詢優化對server_base和multi_client_base類均有效。

查詢除了大家熟悉的find,exist等調用外,do_something_to_all和do_something_to_one也算,如果你經常需要多線程查詢,那麼用共享鎖是推薦的做法,前提是std::shared_mutex或者std::timed_shared_mutex可用。通過宏ASCS_SHARED_LOCK_TYPE定義共享鎖的類型(比如std::shared_lock),通過宏ASCS_SHARED_MUTEX_TYPE定義可用於共享鎖的mutex類型(比如std::shared_mutex),你無需考慮需要獨佔鎖的情況,當object_pool需要獨佔鎖的時候,會用std::unique_lock而不會受到你的宏的影響,因爲std::shared_mutex也可以用於獨佔鎖。

消息隊列優化顯然是socket上的操作,你可以通過模板參數或者宏ASCS_INPUT_QUEUE定義發送消息隊列,通過模板參數或者宏ASCS_INPUT_CONTAINER定義發送消息隊列所用的容器(同理還有ASCS_OUTPUT_QUEUE和ASCS_OUTPUT_CONTAINER用於接收消息隊列和容器的定義)。其中容器必須是個僅帶一個模板參數(即消息類型)的類,隊列必須是個僅帶兩個模板參數(即容器類型和鎖類型)的類。容器必須有如下接口(其實最好的辦法就是編譯,讓編譯器告訴你缺少什麼接口),可以看出來它應該是鏈式的而不是連續內存比如std::vector(連續內存結構在保持效率的情況下你提供不了這些接口):

//Container must at least has the following functions (like std::list):
// Container() and Container(size_t) constructor
// empty, must be thread safe, but doesn't have to be consistent
// clear
// swap
// template<typename T> emplace_back(const T& item), if you call direct_(sync_)send_msg which accepts other than rvalue reference
// template<typename T> emplace_back(T&& item)
// template<typename T> emplace_front(const T& item), if you call (sync_)resend_msg which accepts other than rvalue reference
// template<typename T> emplace_front(T&& item), if you call (sync_)resend_msg
// splice(iter, Container&)
// splice(iter, Container&, iter, iter)
// front
// pop_front
// back
// begin
// end

至於隊列需要的接口,我沒總結,你可以用上面的方法,就是編譯你的自定義隊列,編譯器會告訴你缺少什麼接口。個人推薦就用我提供的隊列(queue)即可,它支持帶鎖和不帶鎖,於是有了下面的定義:

template<typename Container> using non_lock_queue = queue<Container, dummy_lockable>; //thread safety depends on Container
template<typename Container> using lock_queue = queue<Container, lockable>;

無鎖隊列僅能用於某些特殊的場合,比如單線程環境和一些特殊的業務,比如一應一答式業務(乒乓測試)。

引入自定義隊列是爲了支持有鎖和無鎖,引用自定義容器是爲了使用不同的內存分配器,如果你沒有這兩項需求,不建議定製化隊列或者容器。

上一篇:ascs 簡明開發教程(11)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章