2016-01-22 81 views
1

我有一個要求,我必須在套接字上寫,然後從套接字連續讀取響應和處理數據。 我已經創建了2個類A和B. A有write()和read()api,B有processdata()api。 我創建了從A :: read()到B :: processdata()的回調。 但我正面臨着多線程問題,因爲我是新手。 線程讀取()api必須始終運行,但在處理B :: processdata()中的數據時,服務器正在發送一些更多的關於套接字read()的數據,這是我缺少的。 請爲這個問題提出一些設計,以便我可以保存數據,同時我的processdata函數可以完成它的工作,並且可以再次回讀以讀取數據(小例子)? 我想維護3個線程,每個寫1,讀取和processdata。但我不知道如何在完成processdata線程後重新讀取線程。多線程讀取和寫入服務器在c + +

對不起,很長的文章,但我會很感激,如果有人可以幫助我這個。

以下是我在我的項目中使用的非常高級的代碼設計。

//A.cpp 
     class A { 
     public: 
      void write(); 
      void read(b* obj); 
     } 
     void A::write() 
     { 
      //code to write to socket 

      } 
     void A::read(b* obj) 
     { 
      //code to read from socket 
      // if data received call below function 
      obj->processdata(buffer) 
      } 

    //B.cpp  
     class B { 
     public: 
      processdata(buffer) 
     } 

     void B::processdata(buffer) 
     { 
      //code to processdaata from socket 
      } 
//Main.cpp 
     int main() 
     { 
      A* objA = new A; 
      B* objB = new B; 
      objA->write() 
      while(1) 
      { 
      objA->read(objB) 
      } 
     } 
+0

爲什麼不能嘗試使用臨界區域?根據我的理解,你正在詢問線程同步嗎? –

+0

您需要複製「緩衝區」的內容或使用多個緩衝區,以便在處理較早的數據時繼續接收數據。您必須有一些方法來存儲這些緩衝區,直到'B'能夠處理它們,同時讓'B'線程等待數據可用。 2線程之間的同步至關重要。 – 1201ProgramAlarm

+0

@Akhil:請原諒我的天真,但您是在談論如何使用信號量/互斥鎖來保護我的緩衝區?我的問題是,在處理數據時,我阻止在套接字處讀取數據,因爲我的代碼正在處理數據。所以我想要爲創建多線程模型提供幫助。 你能幫我一個小例子嗎? – harry

回答

1

A.cpp

extern CRITICAL_SECTION g_cCritSec; 
     class A { 
     public: 
      static void write(); 
      static void read(void* obj); 
     } 
     void A::write() 
     { 

      EnterCriticalSection(&g_cCritSec); 
      //code to write to socket 
      LeaveCriticalSection(&g_cCritSec); 

     } 
     void A::read(void* obj) 
     { 
      EnterCriticalSection(&g_cCritSec); 
      while(1) 
      { 
       //code to read from socket 
       // if data received call below function 
       // send separate copy of buffer to avoid overrite 
       uintptr_t Thread2 = _beginthread(B::processdata, 0, (void *) buffer); 

       //obj->processdata(buffer) 
      } 
      LeaveCriticalSection(&g_cCritSec); 
     } 

B.cpp

extern CRITICAL_SECTION g_cCritSec; 
     class B { 
     public: 
      static processdata(void *buffer) 
     } 

     void B::processdata(void *buffer) 
     { 
      Buffer *bufferReceive = (Buffer*)buffer; 
      //code to processdaata from socket 
     } 

Main.cpp的

CRITICAL_SECTION g_cCritSec; 
     int main() 
     { 

      InitializeCriticalSection(&g_cCritSec); 
      B* objB = new B; 
      objA->write(); 
      uintptr_t Thread1 = _beginthread(A::read, 0, (void *) objB); 

      DeleteCriticalSection(&g_cCritSec); 
     } 

將這個答案可以幫助您?作爲例程(我們需要將memeber函數定義爲靜態以用作線程回調),將作爲靜態記憶函數A::Read啓動Thread1的最小多線程應用程序。從Read功能它將開始另一個線索與buffer副本傳遞給它。這兩個線程將同時執行

+0

哇。只是我正在尋找的答案。謝了哥們。 我還有一個查詢,對於線程和套接字的目的我應該使用Boost Libs嗎? 我讀C++ 11有線程支持,但是當我使用「線程t」,我得到錯誤說「錯誤:'線程'不是'std'的成員」:( 此外,我必須使此代碼獨立的操作系統,因爲可以在Linux和Windows上交叉編譯。 可以請你提出一些有關這方面的建議嗎? – harry

+0

如果它解決了你的問題,請把它作爲接受的答案。嘗試包括pthread.h並使用請參考 pthread_create創建posix線程的函數 –

+0

非常感謝 – harry