2013-01-02 38 views
0

我已經創建了一個模塊來使用TCP客戶端服務器通信使用多個套接字來傳輸數據。這將在10秒內傳輸20MB的文件。多級線程需要時間

多個套接字在每個單獨的線程中發送/接收數據。

當我從另一個工作線程啓動模塊時,發送同一文件所用的時間增加到40秒。

請讓我知道任何解決方案,以避免時間滯後。

+0

代碼在哪裏? – goji

+0

顯示代碼,指定您使用的線程庫等等。最重要的是,我們在此討論多少個線程?並運行多少CPU核心? – hyde

回答

0

您是否正在同步線程以從客戶端的文件中讀取內容並將其寫回服務器端的文件?這增加了時間。

除此之外,默認情況下,您將在客戶端和服務器上的多個線程之間切換上下文時間。

+0

從線程調用時,上下文切換花費的時間超過200毫秒。但是,當從主線程調用模塊時,上下文切換最大爲16毫秒。有沒有什麼辦法可以減少這個時間? – d2h

0

一個問題可能是磁盤緩存和尋找。如果你還沒有這樣做,可以嘗試更精細地交錯由不同線程傳輸的塊(比如,比如4KB,所以第一個線程傳輸字節0 ... 4095,第二個線程傳輸4096 ... 8191等)。

還可以避免互斥鎖,例如讓每個線程知道在線程啓動時它應該讀取和發送什麼,或者寫入和接收什麼,所以不需要線程間通信。中止整個傳輸可以通過原子標誌變量(在傳輸塊之後由每個線程檢查)而不是互斥體完成。

另外在接收端,請確保在內存中執行緩衝,以便順序寫入目標文件。也就是說,如果一個線程比其他線程更快地傳輸塊,那麼這些「早期」塊將保存在內存中,直到所有前面的塊都被接收和寫入。

如果緩衝區大小成爲問題,那麼您可能需要在一端實現一些線程間同步(無關緊要,您是否減慢了接收或發送速度),以防止最快的線程太遠前進最慢的線程,但對於數十兆字節的文件大小,在個人電腦上,這不應該成爲一個問題。

+0

我正在使用每個線程將文件讀入多個緩衝區。在接收端,數據再次保存在緩衝區中,以正確的順序排序。 – d2h