关于 Boost:asio 多线程的有关问题
关于 Boost::asio 多线程的问题
在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();
}
意思应该是说启动指定个数的线程池,分别调用io_service_的run()函数然后等待所有异步操作都结束。
但我的问题是在并发运行的时候,为什么每来一个连接请求它都会去调用asyn_accept的函数呢。这个多线程到底是怎么体现出来的。
------解决方案--------------------
是线程池,不是多线程。
在异步信号发生时,注册的函数被触发。
触发是在调用run函数的线程内调用的。
可以把调用run的几个线程想像成几条吃包子的狗,吃完一个就会等下一个。
把async系列函数想成是包包子,
网络事件发生,就是包子包好了,扔过去,几条狗抢着吃。
------解决方案--------------------
在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();
}
意思应该是说启动指定个数的线程池,分别调用io_service_的run()函数然后等待所有异步操作都结束。
但我的问题是在并发运行的时候,为什么每来一个连接请求它都会去调用asyn_accept的函数呢。这个多线程到底是怎么体现出来的。
------解决方案--------------------
是线程池,不是多线程。
在异步信号发生时,注册的函数被触发。
触发是在调用run函数的线程内调用的。
可以把调用run的几个线程想像成几条吃包子的狗,吃完一个就会等下一个。
把async系列函数想成是包包子,
网络事件发生,就是包子包好了,扔过去,几条狗抢着吃。
------解决方案--------------------