我正在使用boost :: asio async_operations来构建服务器。服务器从组中的客户端(就像聊天室)接收一些数据,然后进行一些处理,然后将数据发送回该组的每个参与者;但是该过程可能需要很多时间。
所以我的代码是:
void do_read()
{
async_read(...,strand.wrap(read_handler));
}
void read_handler()
{
//here should do some process witch spend a lot of time,so i put it in a //thread
std::thread work([]())
{
//do process... after process,i need to send the answer to each member
//of the group; strandis a boost::asio::strand type
io_context.post(strand.wrap(doWrite));
}
work.detach();
do_read();// i need to keep reading ,and i hope read and write are independent,so i need a designe like Consumer Pattern ,one thread for read ,put the data to a queue; then another thread get data from the queue
}
void doWrite()
{
//write the result of process to client;
//push the msg in deque ,just like the demo chat_room of boost::asio
bool flg=deque.empty();
deque.push(msg);
work.detach();
do_read();// i need t
if(flg)
{
write();
}
}
void write()
{
async_write(buffer(deque.front()),strand.wrap(handler_write));
deque.pop();
}
void handler_write
{
if(!deque.empty())
{
write();
}
}
但是该程序仅运行一个async_read,并停止再次进入read_handler。如果我注释掉有关async_write的代码,则服务器可以继续从客户端读取数据。我的代码中有什么错误吗?
我的问题是:
如何使用boost :: asio实现消费者模式?
如果在async_read_handler之后需要做一些繁重的工作,我需要启动一个线程,我的代码正确吗?
我需要在read_handler()中操作async_write吗?还是我需要在write_handler()中进行async_read操作?
我只希望服务器从一个客户端接收一些数据,然后执行一些处理(可能会花费很多时间,并且我希望在一个线程中处理),然后在处理之后,我发送结果对某些客户我希望读写是独立的。