您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++如何實現雙緩存隊列,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
具體如下:
“雙緩存隊列”是我在一次開發任務中針對特殊場景設計出來的結構。使用場景為:發送端持續向接收端發送數據包——并且不理會接收端是否完成業務邏輯。由于接收端在任何情況下停止響應即可能產生數據丟失,因此無法簡單的設計一條線程安全隊列來對數據寫入或讀取(讀取數據時將隊列上鎖視為對寫入的停止響應)。
鑒于此,我的設計思路如下:
接收端首先向A隊列中寫入數據,然后當數據處理請求到來的時候切換到B隊列繼續寫入,之后將A隊列中的數據交給數據處理模塊,處理完成以后A隊列數據清空。當下一次數據處理請求到來時,再將寫入請求切換回A隊列,并把B隊列中的數據提交給數據處理模塊再清空隊列B,輪流作業。
有了思路以后,代碼就比較簡單了。
#include <list> template<typename T> class DoubleArray { struct NODE { T t; NODE* next; }; int size_a; int size_b; NODE* header_a; NODE* header_a_cur; NODE* header_b; NODE* header_b_cur; int trigger; public: DoubleArray() : size_a(0), size_b(0), trigger(0), header_a(0), header_a_cur(0), header_b(0), header_b_cur(0) { } int push(T t); std::list<T>& fetch(std::list<T>& list); }; template<typename T> int DoubleArray<T>::push(T t) { NODE *n = new NODE; n->t = t; n->next = 0; if (size_a == 0 && trigger == 0) { header_a = n; header_a_cur = n; size_a++; } else if (size_b == 0 && trigger == 1) { header_b = n; header_b_cur = n; size_b++; } else { switch (trigger) { case 0: header_a_cur->next = n; header_a_cur = n; size_a++; break; case 1: header_b_cur->next = n; header_b_cur = n; size_b++; break; } } } template<typename T> std::list<T>& DoubleArray<T>::fetch(std::list<T>& list) { switch (trigger) { case 0: if (header_a != 0) { // change b trigger = 1; // fetch a NODE* temp = header_a; while (temp) { list.push_back(temp->t); temp = temp->next; } // delete a temp = header_a; for (int i = 0; i < size_a; ++i) { NODE* p = temp; temp = temp->next; delete p; } size_a = 0; header_a = 0; header_a_cur = 0; } break; case 1: if (header_b != 0) { // change a trigger = 0; // fetch b NODE* temp = header_b; // delete b while (temp) { list.push_back(temp->t); temp = temp->next; } temp = header_b; for (int i = 0; i < size_b; ++i) { NODE* p = temp; temp = temp->next; delete p; } size_b = 0; header_b = 0; header_b_cur = 0; } break; } return list; }
注:開發環境與IDE分別為CentOS 7,NetBeans 8.2
感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++如何實現雙緩存隊列”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。