Какой подход к обработке ответа лучше всего подходит для сетевого программирования boost-asio?

StackOverflow https://stackoverflow.com/questions/763429

Вопрос

Я новичок в сетевом программировании и, в частности, в асинхронных процессах.Начните также с нового с помощью boost-lib

Я реализую класс для доступа к imap-серверу.Я могу отправлять и получить команды и ответ, в целом

Ответ ставится в очередь внутри класса.Я просто помещаю строки ответа в очередь для дальнейшей обработки.

Как теперь лучше всего обработать ответ в очереди?

  1. Дополнительный поток для проверки (по времени) очереди на наличие новых записей?
  2. Каждый раз, когда новые записи помещаются в очередь, выполняется обратный вызов?
    Как я могу реализовать и интегрировать этот обратный вызов?

Может быть, у кого-то есть короткий пример для этого.

Спасибо

Это было полезно?

Решение

Каждый раз, когда новые записи помещаются в очередь, выполняется обратный вызов?Как я могу реализовать и интегрировать этот обратный вызов?

Я предполагаю, что вы работаете с однопоточным синхронным соединением.

Сделайте что-то вроде этого:

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 количество «потоков обработки очереди», ожидающих в фоновом режиме.

  1. Каждый раз, когда что-то помещается в очередь, ваш семафор отправляет сигнал.

    • Сигнал принимается спящими потоками «обработки очереди», которые начинают обработку очереди, поскольку знают, что у них есть данные.

    • Когда поток завершит обработку своих данных, проверьте размер очереди, чтобы увидеть, должен ли он захватить что-то еще, если нет, то вернитесь к ожиданию сигнала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top