对于 boost-asio 网络编程,处理响应的最佳方法是什么?
-
11-09-2019 - |
题
我对网络编程特别是异步进程很陌生。从 boost-lib 开始新的工作
我正在实现一个类来访问 imap 服务器。我可以发送并接收命令和响应,通常
响应在类内的出队中排队。我将简单的响应行放入队列中,以供进一步处理。
现在处理排队响应的最佳方法是什么?
- 一个额外的线程来检查(基于时间的)队列中的新条目?
- 每次将新条目推送到队列时都会进行一些回调吗?
我如何实现和集成这个回调?
也许有人有一个简短的例子。
谢谢
解决方案
每次将新条目推送到队列时都会进行一些回调吗?我如何实现和集成这个回调?
我假设您正在使用单线程同步连接。
做这样的事情:
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 个“队列处理线程”在后台等待。
每次有东西被推入队列时,信号量都会发送信号。
该信号由休眠的“队列处理”线程接收,这些线程开始处理队列,因为它们知道自己有数据。
当线程完成处理其数据时,检查队列大小以查看它是否应该抓取其他内容,如果不是,则返回等待信号。
不隶属于 StackOverflow