io_service类 boost asio

我整理修改的代码

void connect_handler()
{


}


void timeout_handler(const boost::system::error_code &error)
{
if (error)
{


}
}


using namespace boost::asio;


void run_service(int idx, io_service service[])
{
service[idx].run();
}


#include <boost/asio/deadline_timer.hpp>
#include <boost/thread.hpp>


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);


//server s(666666, 50);
//s.run();


io_service service[2];


ip::tcp::socket sock1(service[0]);
ip::tcp::socket sock2(service[1]);
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 6688);
sock1.async_connect( ep, boost::bind(connect_handler));
sock2.async_connect( ep, boost::bind(connect_handler));
deadline_timer t(service[0], boost::posix_time::seconds(5));
t.async_wait(timeout_handler);
for ( int i = 0; i < 2; ++i)
boost::thread( boost::bind(&run_service, i, service));





return a.exec();
}




你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例。ios_service是这个库里面最重要的类;它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处理程序。

如果你选择用同步的方式来创建你的应用,你则不需要考虑我将在这一节向你展示的东西。 你有多种不同的方式来使用io_service。在下面的例子中,我们有3个异步操作,2个socket连接操作和一个计时器等待操作:

有一个io_service实例和一个处理线程的单线程例子:

io_service service; // 所有socket操作都由service来处理

ip::tcp::socket sock1(service); // all the socket operations are handled by service

ip::tcp::socket sock2(service);

 sock1.asyncconnect( ep, connect_handler);

sock2.async_connect( ep, connect_handler);

deadline_timer t(service, boost::posixtime::seconds(5));

t.async_wait(timeout_handler);service.run();

有一个io_service实例和多个处理线程的多线程例子:

io_service service;

ip::tcp::socket sock1(service);

ip::tcp::socket sock2(service);

sock1.asyncconnect( ep, connect_handler);

sock2.async_connect( ep, connect_handler);

deadline_timer t(service, boost::posixtime::seconds(5));

t.async_wait(timeout_handler);

for ( int i = 0; i < 5; ++i)

boost::thread( run_service);

void run_service()

{

service.run();

}


有一个io_service实例和多个处理线程的多线程例子:

io_service service;

ip::tcp::socket sock1(service);

ip::tcp::socket sock2(service);

sock1.asyncconnect( ep, connect_handler);

sock2.async_connect( ep, connect_handler);

deadline_timer t(service, boost::posixtime::seconds(5));

t.async_wait(timeout_handler);

for ( int i = 0; i < 5; ++i)

boost::thread( run_service);

void run_service()

{

service.run();

}


有多个io_service实例和多个处理线程的多线程例子:

io_service service[2];

ip::tcp::socket sock1(service[0]);

ip::tcp::socket sock2(service[1]);

sock1.asyncconnect( ep, connect_handler);

sock2.async_connect( ep, connect_handler);

deadline_timer t(service[0], boost::posixtime::seconds(5));

t.async_wait(timeout_handler);

for ( int i = 0; i < 2; ++i)

boost::thread( boost::bind(run_service, i));

void run_service(int idx)

{

service[idx].run();

}


首先,要注意你不能拥有多个io_service实例却只有一个线程。下面的代码片段没有任何意义:

for ( int i = 0; i < 2; ++i)

service[i].run();

上面的代码片段没有意义是因为service[1].run()需要service[0].run()先结束。因此,所有由service[1]处理的异步操作都需要等待,这显然不是一个好主意。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金士顿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值