1

我是网络编程的新手,尤其是异步进程。从 boost-lib 开始

我正在实现一个类,以访问 imap 服务器。一般来说,我可以发送和接收命令和响应

响应在类内的出列队列中排队。我将简单的响应行放入队列中,以供进一步处理。

现在处理排队响应的最佳方法是什么?

  1. 一个额外的线程来检查(基于时间)队列,是否有新条目?
  2. 每次将新条目推送到队列时都会进行一些回调?
    如何实现和集成此回调?

也许有人对此有一个简短的例子。

谢谢

4

2 回答 2

1

实现队列处理器的一种可能方式是使用信令信号量。

例如,如果您在符合 POSIX 的平台上,则为pthread 条件类型描述)。

您可以在后台等待 N 个“队列处理线程”。

  1. 每次将某些东西推入队列时,您的信号量都会发送它的信号。

    • 信号由休眠的“队列处理”线程接收,这些线程开始处理队列,因为它们知道自己有数据。

    • 当线程完成处理它的数据时,检查队列大小以查看它是否应该获取其他内容,如果没有,则返回等待信号。

于 2009-04-18T14:37:15.163 回答
1

每次将新条目推送到队列时都会进行一些回调?如何实现和集成此回调?

我假设您正在使用单线程同步连接。

做这样的事情:

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 的同一线程中调用。

于 2009-04-18T17:24:27.557 回答