Для сетевого программирования boost-asio каков наилучший подход для обработки ответа? - PullRequest
1 голос
/ 18 апреля 2009

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

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

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

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 18 апреля 2009

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

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

Сделай что-нибудь подобное:

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.

1 голос
/ 18 апреля 2009

Один из возможных способов реализации процессора очередей - это использование сигнального семафора.

Например тип условия pthread ( описание ), если вы используете POSIX-совместимую платформу.

Вы можете иметь N число «потоков обработки очереди», ожидающих в фоновом режиме.

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

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

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

...