个人纯笔记记录:
Boost.Asio的线程
io_service:io_service是线程安全的。几个线程可以同时调用io_service::run()。大多数情况下你可能在 一个单线程函数中调用 io_service::run(),这个函数必须等待所有异步操作完成之后才能继续执行。然 而,事实上你可以在多个线程中调用 io_service::run()。这会阻塞所有调用io_service::run()的线程。只 要当中任何一个线程调用了io_service::run(),所有的回调都会同时被调用;这也就意味着,当你在一 个线程中调用io_service::run()时,所有的回调都被调用了
socket:socket类不是线程安全的。所以,你要避免在某个线程里读一个socket时,同时在另外一个线 程里面对其进行写入操作。(通常来说这种操作都是不推荐的,更别说Boost.Asio)。 utility:就utility来说,因为它不是线程安全的,所以通常也不提倡在多个线程里面同时使用。里面的方法 经常只是在很短的时间里面使用一下,然后就释放了。
除了你自己创建的线程,Boost.Asio本身也包含几个线程。但是可以保证的是那些线程不会调用你的代码。 这也意味着,只有调用了io_service::run()方法的线程才会调用回调函数。
io_service类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处 理程序。
1.一个io_service实例和一个处理线程的单线程例子:
io_service service; // 所有socket操作都由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);
service.run();
io_service service;
2.一个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();
}
3.多个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();
}