Boost异步任务

在软件开发里,常常遇到多个任务同时添加的情况,比如用户要下载一部电视连续剧,就会一起添加几十集,让它一集一集地下载。如果这时使用线程池来运行,就需要这个任务队列可以多个线程同时访问它,如果队列里没有任务时,可以让多个线程等着,只要有任务到达,就立即运行。在boost库里提供了一个强大的任务队列,这个队列可以使用线程池访问,也可以当任务为空时阻塞线程。使用这个任务队列,可以让多个任务动态运行,以及适应不同的情况,可以得心应手。在Windows系统上实现是采用IOCP的原理来实现,因此这个任务队列不但可以运行一般的任务,也适用于网络应用方面。具体的使用例子如下:

  1. // boost_014.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <boost/asio.hpp>  
  6. #include <boost/bind.hpp>  
  7. #include <iostream>  
  8.   
  9. void Run(int nVal)  
  10. {  
  11.     std::cout << "Run: " << nVal << std::endl;  
  12. }  
  13.   
  14. //测试任务队列  
  15. //软件开发人员: 蔡军生  2013-04-28  
  16. //QQ: 9073204  
  17. void TestTask(void)  
  18. {  
  19.     //定义一个任务队列。  
  20.     boost::asio::io_service ioSerice;     
  21.     //放入三个任务。  
  22.     ioSerice.post(boost::bind(Run, 10));  
  23.     ioSerice.post(boost::bind(Run, 2));  
  24.     ioSerice.post(boost::bind(Run, 88));  
  25.   
  26.     //运行队列里的任务。  
  27.     ioSerice.run();  
  28. }  
  29.   
  30.   
  31. int _tmain(int argc, _TCHAR* argv[])  
  32. {  
  33.     //  
  34.     TestTask();  
  35.   
  36.     system("pause");  
  37.   
  38.     return 0;  
  39. }  

在 这个例子主要使用boost库里异步库asio,其中boost::asio::io_service是IO服务队列。在函数TestTask里使用 io_service对象的post方法,把三个任务放到队列里,然后调用run方法开始运行添加的任务。当编译运行这个例子,就会输出如下的结果:

Run: 10

Run: 2

Run: 88

请按任意键继续. . .

 

从结果可以看到任务队列是先进先出的队列,最早添加的任务最开始执行。通过这个例子就可以学会使用asio库里的IO任务队列,以后它会广泛使用到网络方面,因此学会这个例子,就打下了良好的基础。

posted @ 2013-11-29 14:11  孤火  阅读(1605)  评论(1编辑  收藏  举报