在线程中提升asio async_write

时间:2018-07-02 16:55:17

标签: c++ boost

我正在使用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的代码,则服务器可以继续从客户端读取数据。我的代码中有什么错误吗?

我的问题是:

  1. 如何使用boost :: asio实现消费者模式?

  2. 如果在async_read_handler之后需要做一些繁重的工作,我需要启动一个线程,我的代码正确吗?

  3. 我需要在read_handler()中操作async_write吗?还是我需要在write_handler()中进行async_read操作?

  4. 我只希望服务器从一个客户端接收一些数据,然后执行一些处理(可能会花费很多时间,并且我希望在一个线程中处理),然后在处理之后,我发送结果对某些客户我希望读写是独立的。

0 个答案:

没有答案