io_service类 boost asio

来源:互联网 发布:有淘宝开店条件 编辑:程序博客网 时间:2024/05/18 07:50

我整理修改的代码

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]处理的异步操作都需要等待,这显然不是一个好主意。