2016-01-22 73 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