Какой подход к обработке ответа лучше всего подходит для сетевого программирования boost-asio?
-
11-09-2019 - |
Вопрос
Я новичок в сетевом программировании и, в частности, в асинхронных процессах.Начните также с нового с помощью boost-lib
Я реализую класс для доступа к imap-серверу.Я могу отправлять и получить команды и ответ, в целом
Ответ ставится в очередь внутри класса.Я просто помещаю строки ответа в очередь для дальнейшей обработки.
Как теперь лучше всего обработать ответ в очереди?
- Дополнительный поток для проверки (по времени) очереди на наличие новых записей?
- Каждый раз, когда новые записи помещаются в очередь, выполняется обратный вызов?
Как я могу реализовать и интегрировать этот обратный вызов?
Может быть, у кого-то есть короткий пример для этого.
Спасибо
Решение
Каждый раз, когда новые записи помещаются в очередь, выполняется обратный вызов?Как я могу реализовать и интегрировать этот обратный вызов?
Я предполагаю, что вы работаете с однопоточным синхронным соединением.
Сделайте что-то вроде этого:
class worker {
deque<message> messages;
bool is_writing_;
push_message(message msg) {
messages.push_back(msg);
notify();
}
void notify()
{
if(!is_writing_) {
is_writing_=true;
init();
}
}
void init()
{
if(messages.empty()) { is_writing_=false; return; }
messamge msg=messages.pop();
convert_to_vector(v);
async_write(socket,buffer(v),
boost::bind(&worker::complete,this,placehoders::error));
}
void complete(error_code const &e)
{
if(!e) {
init();
}
else { cleanup(); }
}
};
Примечание!!!
Это однопоточная реализация.Если вы хотите уведомлять из другого потока, вы не должны звонить some_worker->push_message(msg)
, вам следует использовать iosrvice:
service.post(boost::bind(&worker::push_message,some_worker,msg));
И push_message
будет вызываться из того же потока, в котором выполняется ioservice.
Другие советы
Одним из возможных способов реализации процессора очереди является использование сигнального семафора.
Например тем тип условия pthread (описание), если вы используете платформу, совместимую с POSIX.
У вас может быть N количество «потоков обработки очереди», ожидающих в фоновом режиме.
Каждый раз, когда что-то помещается в очередь, ваш семафор отправляет сигнал.
Сигнал принимается спящими потоками «обработки очереди», которые начинают обработку очереди, поскольку знают, что у них есть данные.
Когда поток завершит обработку своих данных, проверьте размер очереди, чтобы увидеть, должен ли он захватить что-то еще, если нет, то вернитесь к ожиданию сигнала.