boost:asio 在哪个线程回调

作者&投稿:闻习 (若有异议请与网页底部的电邮联系)
boost的asio异步调用的疑问,该怎么解决~

尤其是,我现在觉得aiso异步的效率非常低啊
1,必须把数据拷贝到队列里,否则数据不知道跑哪儿去了
2,必须等一次async_write完成了,才能在handler里再发一次async_write,这非常慢啊
如果你的数据拷贝了,我现在做法是:客户类调用Send,我new一块缓冲区,把数据拷近来,挂在队列里。一个线程在不断的在读队列,如果读到了,就async_write发出去,在write_handler里再读队列,如果队列有数据,再调用async_write,如此循环...

大喊三声就会了 - -或者去翻官方文档 去熟悉io_service,学习线程同步

  这里我们将每秒回调一次,来演示如何回调函数参数的含义
  #include <iostream>
  #include <asio.hpp>
  #include <boost/bind.hpp>
  #include <boost/date_time/posix_time/posix_time.hpp>
  首先,调整一下timer的持续时间,开始一个异步等待.显示,回调函数需要访问timer来实现周期运行,所以我们再介绍两个新参数
  指向timer的指针
  一个int*来指向计数器
  void print(const asio::error& /*e*/,
  asio::deadline_timer* t, int* count)
  {
  我们打算让这个函数运行6个周期,然而你会发现这里没有显式的方法来终止io_service.不过,回顾上一节,你会发现当 asio::io_service::run()会在所有任务完成时终止.这样我们当计算器的值达到5时(0为第一次运行的值),不再开启一个新的异步等待就可以了.
  if (*count < 5)
  {
  std::cout << *count << " ";
  ++(*count);
  ...
  然后,我们推迟的timer的终止时间.通过在原先的终止时间上增加延时,我们可以确保timer不会在处理回调函数所需时间内的到期.
  (原文:By calculating the new expiry time relative to the old, we can ensure that the timer does not drift away from the whole-second mark due to any delays in processing the handler.)
  t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
  然后我们开始一个新的同步等待.如您所见,我们用把print和他的多个参数用boost::bind函数合成一个的形为void(const asio::error&)回调函数(准确的说是function object).
  在这个例子中, boost::bind的asio::placeholders::error参数是为了给回调函数传入一个error对象.当进行一个异步操作,开始 boost::bind时,你需要使用它来匹配回调函数的参数表.下一节中你会学到回调函数不需要error参数时可以省略它.
  t->async_wait(boost::bind(print,
  asio::placeholders::error, t, count));
  }
  }
  int main()
  {
  asio::io_service io;
  int count = 0;
  asio::deadline_timer t(io, boost::posix_time::seconds(1));
  和上面一样,我们再一次使用了绑定asio::deadline_timer::async_wait()
  t.async_wait(boost::bind(print,
  asio::placeholders::error, &t, &count));
  io.run();
  在结尾,我们打印出的最后一次没有设置timer的调用的count的值
  std::cout << "Final count is " << count << " ";
  return 0;


海拉尔区18970785702: boost:asio 在哪个线程回调 -
潭风盐酸: 这里我们将每秒回调一次,来演示如何回调函数参数的含义#include #include #include #include 首先,调整一下timer的持续时间,开始一个异步等待.显示,回调函数需要访问timer来实现周期运行,所以我们再介绍两个新参数指向timer的...

海拉尔区18970785702: 各位对用Boost里面的asio进行网络编程有什么看法 -
潭风盐酸: 简介 Boost.Asio是一个跨平台的C++库,主要用于网络和其他一些底层的I/O编程. 在大量的网络编程库中,Boost.Asio是其中的佼佼者,它于2005年加入到Boost,已经被广泛的测试并且应用在多个项目中

海拉尔区18970785702: boost::asio同一次连接中SOCKET能不能既接收数据又发送数据?怎么使socket不自动断 -
潭风盐酸: 1.建议使用一个socket专门接收数据,一个socket专门负责发送数据.2.如果使用一个socket既发送又接收,很可能出现这样的问题(如果该socket正在接收数据,而又想同时发送数据,你会想到什么后果吗?)

海拉尔区18970785702: Linux下,Boost.Asio是如何通过epoll做到异步IO的
潭风盐酸: 把操作通过队列交给epoll线程就可以了.

海拉尔区18970785702: 如何使用boost.asio写一个简单的通信程序 -
潭风盐酸: boost/asio库中封装了很多关于scoket的函数,当然,asio库还包含很多底层的库.我们可以用socket编写一个基于UDP协议的黑框通讯程序.要想使用asio里面的函数,大多都需要先创建一个io_service对象,然后通过这个serveice来构造不同...

海拉尔区18970785702: 如何在C++中实现fullstack coroutine -
潭风盐酸: #include <boost/asio.hpp>#include <boost/asio/spawn.hpp>#include <memory>#include <functional>#include <iostream>class session : public std::enable_shared_from_this < session >{public:explicit session(boost::asio::io_service& io_...

海拉尔区18970785702: boost asio socket 服务端 底层是不是 iocp -
潭风盐酸: boost asio socket 服务端 底层是不是 iocp ACE底层是C风格的OS适配层,上一层基于C++的wrap类,再上一层是一些框架(Accpetor, Connector,Reactor,Proactor等),最上一层是框架上服务.Boost.ASIO与之类似,底层是OS的适配层,上一层一些模板类,再上一层模板类的参数化(TCP/UDP),再上一层是服务,它只有一种框架为io_service.livevent在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务

海拉尔区18970785702: c++ boost库的bind和function的用法 -
潭风盐酸: //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//为何编译错误 你这时,明显是 functin1了,有一个参数的. 而且你的类型也不匹配. asio很多都是用模板来做的,可以匹配多种情况

海拉尔区18970785702: boost库asio下的例子如何编译啊? -
潭风盐酸: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>#define PORT 8888void *yourfunction(void *connect_fd) {int connfd = *((...

海拉尔区18970785702: 请教:使用boost:asio库,acceptor的问题 -
潭风盐酸: typedef boost::asio::ip::tcp::acceptor AcceptorType; typedef boost::asio::ip::tcp TcpType; AcceptorType m_acceptor; TcpType::endpoint endpoint(TcpType::v4(), m_port);m_acceptor.open(endpoint.protocol()); // 这里会阻塞!!! m_acceptor.set...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网