2011-06-16 56 views
2
int str_len = read(m_events[i].data.fd, buf, BUF_SIZE); 

我有這個,我將數據讀入的BUF聲明如下如何在緩衝區中的數據複製到某處內存(字符*)

char buf[BUF_SIZE]; 

我所試圖做的是,我想獲取數據並將其交給我定義的WorkHanndler,只不過是一個線程池。

而且功能

void ServerManager::addWork(int sender, char *data){ 
    Work* work = new Work(sender, data); 
    m_workHandler->addWork(work); 
} 

所以我需要一個字符指針,它指向我剛纔讀的數據。由於緩衝區被定義爲一個數組,我將無法將其傳遞給函數。

另外,你們認爲這是一個在服務器設計方面的好主意嗎?我正在從緩衝區中讀取數據,不解析它,只是將原始數據交給線程池(插入到隊列中)。線程池有一個隊列,五個單獨的線程競爭使用互斥鎖和條件變量從隊列中獲取作業。完成作業後,單獨的線程會將結果寫入輸出緩衝區。請讓我知道它是否有缺點,並且你們有更好的主意。提前致謝。

+0

你可能想要的數據尺寸加入該功能。 – DanDan 2011-06-16 10:57:05

回答

0

我現在看到的可能的缺陷可能在Work類中:確保它在構造函數中立即創建自己的緩衝區內容副本,因爲一旦新數據到達,它將被覆蓋。除此之外,它應該按預期工作(如果沒有要完成的具體工作,很難判斷等)。

也有不應該使用時,需要一個指針數組的元素的類型的陣列作爲陣列本質上只是一個指針(代碼明智)是一個問題:

char data[1024]; 
char *pdata = data; // now data as well as pdata point to the first element 
// data[0] is the same as using *(pdata + 0) 
// data[1] is the same as using *(pdata + 1) 

如果有一些編譯器警告或錯誤,發佈確切的消息。訪問數組的兩種變體唯一真正的區別是編譯器會知道,當使用char variable[]而不是char *variable時,他會得到一個整數而不是單個實例。

0

我認爲「不兼容的類型」應該只是一個警告。 如果它是一個錯誤,然後嘗試將緩衝區中的char *賦給函數。 但這是一個快速和骯髒的解決方案 也許你應該考慮一個更通用的解決方案,不會產生這個錯誤。

解析數據應該是工作者的工作。 如果你讓主人解析它會減慢他的速度。

0

你可以避免複製嗎?如果您將數據讀入緩衝區類,則可以將緩衝區實例排隊,並立即爲下一批數據創建另一個數據。沒有複製和池線程將始終在不同於從套接字讀取的服務器線程的不同數據上工作。當然,在池線程處理完數據之後,你將不得不釋放緩衝區對象(或者重新編譯它們),但這是一個很小的代價,可以避免複製,讀/寫衝突,跨線程同步的緩衝區指針操作和所有那些難以理解的令人討厭的東西。

RGDS, 馬丁