2016-01-22 1 views
1

У меня есть требование, когда я должен писать на сокете, а затем непрерывно читать ответ сокета и обрабатывать данные. Я создал 2 класса A и B. A имеет write() и read() api, а B имеет processdata() api. Я создал обратный вызов из A :: read() в B :: processdata(). Но я столкнулся с проблемой с несколькими потоками, так как я новичок в этом. Thread to read() api должен всегда работать, но при обработке данных в B :: processdata() сервер отправляет еще несколько данных в socket read(), которые мне не хватает. Пожалуйста, предложите какой-нибудь дизайн для этой проблемы, чтобы я мог хранить данные, пока моя функция processdata может завершить работу и может вернуться к чтению данных (с небольшим примером)? Я думал о том, чтобы поддерживать 3 потока, 1 для каждой записи, чтения и обработки данных. Но я не уверен, как вернуться к чтению нити после завершения потока processdata.Многопоточность для чтения и записи на SERVER в 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); 
     } 

будет этот ответ поможет вам? Минимальное многопоточное приложение, которое запустит Thread1 как функцию статического memeber A::Read в качестве подпрограммы (нам нужно определить функцию memeber как статическую для использования в качестве обратного потока). From Read Функция запускает другой поток с передачей ему buffer. Здесь оба потока будут выполняться одновременно

+0

Ничего себе. Просто ответ, который я искал. Спасибо друг. У меня есть еще один запрос: для Threading и socket я должен использовать Boost Libs? Я читал, что C++ 11 поддерживает поток, но когда я использую «thread t», я получаю сообщение об ошибке «error:« thread »не является членом« std »:( Кроме того, я должен сделать этот код независимым OS, так как это может быть скомпилировано на Linux, а также на окнах. Может быть, вы также предложили некоторые вещи относительно этого? – harry

+0

Если это решение вашей проблемы, пожалуйста, сделайте это как принятый ответ. Попробуйте включить pthread.h и используйте pthread_t (не pthread t) класс для создания потоков. Обратитесь к Функция pthread_create для создания потоков posix. –

+0

Спасибо большое. – harry