我是网络编程的新手,尤其是异步进程。从 boost-lib 开始
我正在实现一个类,以访问 imap 服务器。一般来说,我可以发送和接收命令和响应
响应在类内的出列队列中排队。我将简单的响应行放入队列中,以供进一步处理。
现在处理排队响应的最佳方法是什么?
- 一个额外的线程来检查(基于时间)队列,是否有新条目?
- 每次将新条目推送到队列时都会进行一些回调?
如何实现和集成此回调?
也许有人对此有一个简短的例子。
谢谢
我是网络编程的新手,尤其是异步进程。从 boost-lib 开始
我正在实现一个类,以访问 imap 服务器。一般来说,我可以发送和接收命令和响应
响应在类内的出列队列中排队。我将简单的响应行放入队列中,以供进一步处理。
现在处理排队响应的最佳方法是什么?
也许有人对此有一个简短的例子。
谢谢
实现队列处理器的一种可能方式是使用信令信号量。
例如,如果您在符合 POSIX 的平台上,则为pthread 条件类型 (描述)。
您可以在后台等待 N 个“队列处理线程”。
每次将某些东西推入队列时,您的信号量都会发送它的信号。
信号由休眠的“队列处理”线程接收,这些线程开始处理队列,因为它们知道自己有数据。
当线程完成处理它的数据时,检查队列大小以查看它是否应该获取其他内容,如果没有,则返回等待信号。
每次将新条目推送到队列时都会进行一些回调?如何实现和集成此回调?
我假设您正在使用单线程同步连接。
做这样的事情:
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 的同一线程中调用。