#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream>
void handler1(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
void handler2(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
boost::asio::io_service io_service;
void run()
{
io_service.run();
}
int main()
{
boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5));
timer1.async_wait(handler1);
boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(5));
timer2.async_wait(handler2);
boost::thread thread1(run);
boost::thread thread2(run);
thread1.join();
thread2.join();
}
多次调用同一个 I/O 服务的 run() 方法,是为基于 Boost.Asio 的应用程序增加可扩展性的推荐方法。
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream>
void handler1(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
void handler2(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
boost::asio::io_service io_service1;
boost::asio::io_service io_service2;
void run1()
{
io_service1.run();
}
void run2()
{
io_service2.run();
}
int main()
{
boost::asio::deadline_timer timer1(io_service1, boost::posix_time::seconds(5));
timer1.async_wait(handler1);
boost::asio::deadline_timer timer2(io_service2, boost::posix_time::seconds(5));
timer2.async_wait(handler2);
boost::thread thread1(run1);
boost::thread thread2(run2);
thread1.join();
thread2.join();
}
另外还有一个不同的方法:不要绑定多个线程到单个 I/O 服务,而是创建多个 I/O 服务。 然后每一个 I/O 服务使用一个线程。
==================================
在www.boost.org的boost::asio库中有一个示例程序HTTP SERVER 3.
这个服务器是使用一个io_service 和一个线程池来调用io_service::run().
在server.cpp源文件中有这样一段函数:
void server::run()
{
// Create a pool of threads to run all of the io_services.
std::vector<boost::shared_ptr<boost::thread> > threads;
for (std::size_t i = 0; i < thread_pool_size_; ++i)
{
boost::shared_ptr<boost::thread> thread(new boost::thread(
boost::bind(&boost::asio::io_service::run, &io_service_)));
threads.push_back(thread);
}
// Wait for all threads in the pool to exit.
for (std::size_t i = 0; i < threads.size(); ++i)
threads[i]->join();
}
在异步信号发生时,注册的函数被触发。
触发是在调用run函数的线程内调用的。
可以把调用run的几个线程想像成几条吃包子的狗,吃完一个就会等下一个。
把async系列函数想成是包包子,
网络事件发生,就是包子包好了,扔过去,几条狗抢着吃。
asio是网络事件异步通知,与线程数无关,
哪怕只是一个线程,也有平台上能达到的最优事件通知。
比如用asio做一个代理服务器,只用一个线程,服务几千个用户,是没有问题的。
thread_pool_size_这个值只有一个作用,就是增强并发,更确切的说这里应该是增强程序处理能力的并发
这个值另外另外还有一个好处,就是可以对于多核处理器的支持;其实你可以理解成是完成端口的守候线程数;(最优化配置为2n+2)
只要稍微了解 Asio 的人都知道,在一个 io_service 上开几个线程后, 接下来就只要简单的使用 io_service.post() 即可投递一个闭包给线程去执行的. 这是一个天然的线程池.还可以同 io 操作复用你的线程.
停止发明垃圾的线程池实现吧
浙公网安备 33010602011771号