qt通過socket通訊,從接收緩衝區中讀取資料,交給執行緒進行處理,那麼問題來了,如果執行緒還沒有處理完資料,則執行緒就沒有辦法繼續從緩衝區中取數,那麼當資料量過大的時候,緩衝區會滿,繼而被覆蓋,從而造成資料的丟失。那麼如何將資料儲存在某個特定的空間內,並且讓其他執行緒進行讀取。這個是執行緒通訊的問題,這個問題有多種方式,一種是作業系統課本上,通過執行緒同步、互斥、訊號量這三種機制實現執行緒通訊,或者就是通過迴圈佇列的方式,完成執行緒通訊。
這篇主要介紹的是第二種方式,即迴圈佇列的方式,進行通訊。
迴圈佇列的實現方式,通過全域性變數定義乙個大的陣列,同時,定義兩個讀寫指標,這個指標不是語言中指標這個型別,可以理解成,兩個標誌位,記錄讀和寫的位置,通過這種方式,可以實現乙個迴圈佇列的基本模型。如下圖:
* 該類負責接收從tcp讀取到的資料。並將資料儲存到緩衝區中
*/class
mythreadrecv
; void
recvmsg(
const
byte
*data,
intlen);
///};
/*** @brief the mythread class
* 處理資料的執行緒
*/class
mythread:
public
qthread
; void
init();
void
run();
///private
: volatile
bool
stopped;
intflag;
mythreadstore *mythreadstore;
};
#endif // mythread_h
[cpp]
view plain
copy
mythread.cpp
#include "mythread.h"
byte
queue1[(1024 * 500)] = ;
///intwreadpoint = 0;
///intwwritepoint = 0;
///mythreadrecv::mythreadrecv()
void
mythreadrecv::recvmsg(
const
byte
*data,
intlen)
/*** 處理佇列不滿的情況
*/queue1[wwritepoint % (1024 * 500)] = data[inum];
wwritepoint = (wwritepoint +1) % (1024 * 500);
} qdebug()<
; }
void
mythread::init()
mythread::mythread()
void
mythread::run()
; while
(!stopped)
if((0 != queue1[(wreadpoint - 2) % (1024 * 500)]) && (0x5a == queue1[(wreadpoint - 1) % (1024 * 500)]) && (0xfe == queue1[(wreadpoint) % (1024 * 500)]) && (1 == iflag))
if(1 == iflag) else
} usleep(10);
} }
上面兩段**中,存在兩個類,mythreadrecv和mythread,前者負責儲存從socket中獲取到的資料,後面這個類負責從佇列中讀取資料,並且處理。這樣的機制,能夠有效的處理迴圈佇列中的資料,從而達到實時處理資料,並且保證資料準確性和實時性的問題,但是乙個重點是,需要考慮什麼時候佇列滿,什麼時候佇列空,這個問題是設計這個迴圈佇列並且處理的關鍵,需要根據問題仔細的去分析,然後設計。
對於迴圈佇列的基本內容,這裡就不做詳細的描述,因為比較簡單,可以自行查詢資料結構相關的內容。
如何提高企業實時處理資料的自動化程度?
本文主要圍繞當前我國資料自動化傳輸發展現狀和發展前景等方面展開,分析當前國內外企業的資料自動化處理程度,以及如何提高自動化處理程度。目前我國穩居世界第二大經濟體的地位,十多年來,無論是工業化水平還是規模都處於穩步增長階段。相比之下,資料自動化處理水平的發展速度卻沒有顯著進步。國際 商市場中,諸如西門...
Druid大資料實時處理的開源分布式系統 介紹
druid 是乙個為在大資料集之上做實時統計分析而設計的開源資料儲存。這個系統集合了乙個面向列儲存的層,乙個分布式 shared nothing的架構,和乙個高階的索引結構,來達成在秒級以內對十億行級別的表進行任意的探索分析。以下將詳細闡述druid的架構,如何支援快速聚合 靈活的過濾 和低延遲資料...
Druid 乙個用於大資料實時處理的開源分布式系統
druid是乙個用於大資料實時查詢和分析的高容錯 高效能開源分布式系統,旨在快速處理大規模的資料,並能夠實現快速查詢和分析。尤其是當發生 部署 機器故障以及其他產品系統遇到宕機等情況時,druid仍能夠保持100 正常執行。建立druid的最初意圖主要是為了解決查詢延遲問題,當時試圖使用hadoop...