Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于在c+中读取和写入服务器的多线程+;_C++_Multithreading_Sockets_Client Server - Fatal编程技术网

C++ 用于在c+中读取和写入服务器的多线程+;

C++ 用于在c+中读取和写入服务器的多线程+;,c++,multithreading,sockets,client-server,C++,Multithreading,Sockets,Client Server,我有一个要求,我必须在套接字上写,然后连续地从套接字读取响应并处理数据。 我创建了两个类A和B。A有write()和read()api,B有processdata()api。 我已经创建了从A::read()到B::processdata()的回调。 但我面临着多线程的问题,因为我是新手。 Thread to read()api必须始终运行,但在处理B::processdata()中的数据时,服务器正在socket read()上发送更多数据,而我缺少这些数据。 请对此问题提出一些设计建议,以便

我有一个要求,我必须在套接字上写,然后连续地从套接字读取响应并处理数据。 我创建了两个类A和B。A有write()和read()api,B有processdata()api。 我已经创建了从A::read()到B::processdata()的回调。 但我面临着多线程的问题,因为我是新手。 Thread to read()api必须始终运行,但在处理B::processdata()中的数据时,服务器正在socket read()上发送更多数据,而我缺少这些数据。 请对此问题提出一些设计建议,以便我可以在processdata函数完成其工作时继续存储数据,并可以再次返回以读取数据(使用小示例)? 我在考虑维护3个线程,分别用于写入、读取和处理数据。但我不确定在完成processdata线程后如何返回读取线程

很抱歉发了这么长的帖子,但如果有人能帮我,我将不胜感激

下面是我在我的项目中进行的非常高级的代码设计

 //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)
            }
        }
A.cpp

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); 
        }

这个答案对你有帮助吗?一个最小的多线程应用程序,将启动
Thread1
作为静态memeber函数
A::Read
作为例程(我们需要将memeber函数定义为静态以用作线程回调)。从
Read
函数,它将启动另一个线程,并将
缓冲区的副本传递给它。这里两个线程将同时执行

为什么不能尝试使用关键部分?据我所知,您正在询问线程同步?您需要复制
缓冲区的内容
或使用多个缓冲区,以便在处理早期数据时继续接收数据。您必须有某种方法来存储这些缓冲区,直到
B
能够处理它们,同时让
B
线程等待数据可用。两个线程之间的同步是至关重要的。@Akhil:请原谅我的幼稚,你是说用信号量/互斥来保护我的缓冲区吗?我这里的问题是,在处理数据时,我阻止了套接字读取,因为我的代码将处理数据。因此,我需要帮助为同一个套接字创建多线程模型。你能帮我举个小例子吗?@1201程序你能给我举个小例子吗?我将非常乐于助人,非常感谢。这不是一批琐碎的代码。看看“生产者-消费者问题”。哇。这正是我想要的答案。谢谢你,伙计。我还有一个问题,关于线程和套接字,我应该使用boostlibs吗?我读到c++11有线程支持,但当我使用“thread t”时,我得到一个错误:“error:‘thread’不是‘std’的成员”:(另外,我必须使这段代码独立于操作系统,因为它可以在Linux和windows上交叉编译。你能提出一些建议吗?如果这能解决你的问题,请将其作为可接受的答案。尝试包括pthread.h并使用pthread_t(不是pthread t)类创建线程。请参阅pthread_create函数以创建posix线程。
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); 
        }