У меня есть требование, когда я должен писать на сокете, а затем непрерывно читать ответ сокета и обрабатывать данные. Я создал 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)
}
}
Почему не удается использовать критические разделы? как я понимаю, вы спрашиваете о синхронизации потоков? –
Вам нужно либо сделать копии содержимого «буфера», либо использовать несколько буферов, чтобы вы могли продолжать получать данные при обработке более ранних данных. У вас должен быть способ хранения этих буферов до тех пор, пока 'B' не сможет их обработать, а поток' B' ждет, пока данные будут доступны. Важна синхронизация между вашими 2-мя потоками. – 1201ProgramAlarm
@Akhil: Простите мою наивность, но вы говорите о том, чтобы защитить мой буфер с помощью семафора/мьютекса? Моя проблема заключается в том, что при обработке данных я блокирую чтение в сокете, так как мой код будет обрабатывать данные. Поэтому мне нужна помощь в создании многопоточной модели для нее. Можете ли вы помочь мне с небольшим примером для этого? – harry