之前在設計消息隊列的時候,用的雙緩沖,保持一個讀線程,一個寫線程!! 讀線程對read_list進行操作,寫線程對write_list進行操作,保持一個隊列的完整行就ok!
比如如果想保持write_list一致,就是在插入操作的時候枷鎖,在read_list為空的時候需要和write_list進行交換,也需要枷鎖!!這樣就保證了很少的線程沖突!!!當時的消息隊列的雙緩沖使用std::list進行設計!
第二個版本的消息隊列,進行了很大程度上的改進,使用了三個緩沖隊列,一個讀隊列,一個寫隊列,一個緩沖隊列,三個隊列分別用數組形式體現,枷鎖只要保證緩沖隊列一致既可,即寫隊列向緩沖隊列提交數據的時候,需要枷鎖,讀隊列再向緩沖隊列交換數據的時候,需要枷鎖!想比較於上面的方法,枷鎖次數明顯減少,並且使用數組的形式,較std::list更為高效!這個消息隊列在原公司的雙緩沖隊列的基礎之上,進行設計!
給出測試代碼!和部分接口!
+ View Code接口:
class
DuplexList
{
public
:
DuplexList(
int
size = 1024);
virtual
~DuplexList(
void
);
virtual
int
append(CommonItem item);
virtual
int
peek(CommonItem &item);
protected
:
virtual
int
swap(CommonItem &item);
virtual
int
submit();
protected
:
CommonList *read_list_;
CommonList *share_list_;
CommonList *write_list_;
Mutex _switch_mutex;
int
peek_index_;
};
做了一下午的測試,沒有問題,傳遞10w條消息大概使用20ms左右!這個性能可以了!
之前在語言的選擇上面做了很長時間的猶豫,一些java的朋友勸我說,一個消息隊列的錯誤,那麼整個游戲就會崩潰!勸我使用java的集成結構!! 不過最終我還是堅持了C++,底層代碼使用C++,邏輯使用lua來編寫!只是在AI的問題上面還有很多猶豫!