我对网络编程特别是异步进程很陌生。从 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