织梦CMS - 轻松建站从此开始!

罗索

boost::asio::io_service的run,run_one,及poll,poll_one的区别

jackyhwei 发布于 2010-12-02 10:39 点击:次 
run其实就是一直循环执行do_one,并且是以阻塞方式进行的(参数为true),而run_one同样是以阻塞方式进行的,但只执行一次do_one.poll和run几乎完全相同,只是它是以非阻塞方式执行do_one(参数为false).poll_one是以非阻塞方式执行一次do_one.
TAG:

在这几个函数里.其实都是调用了do_one这个函数,而这个函数的作用就是从获取完成端口状态,所有定时器以及网络事件都是通过do_one来调度的.do_one的函数原型:

size_t do_one(bool block, boost::system::error_code& ec);

它的第一个参数说明了是否阻塞,在do_one代码中:

BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred,
 &completion_key, &overlapped, block ? timeout : 0);


可以看到如果为false,将等待时间为0(即不阻塞).

而run,run_one,及poll,poll_one的实现也相当简单,如下:

  1. // Run the event loop until stopped or no more work. 
  2. size_t run(boost::system::error_code& ec) 
  3. if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) 
  4. stop(); 
  5. ec = boost::system::error_code(); 
  6. return 0; 
  7.  
  8. call_stack<win_iocp_io_service>::context ctx(this); 
  9.  
  10. size_t n = 0; 
  11. while (do_one(true, ec)) 
  12. if (n != (std::numeric_limits<size_t>::max)()) 
  13. ++n; 
  14. return n; 
  15.  
  16. // Run until stopped or one operation is performed. 
  17. size_t run_one(boost::system::error_code& ec) 
  18. if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) 
  19. stop(); 
  20. ec = boost::system::error_code(); 
  21. return 0; 
  22.  
  23. call_stack<win_iocp_io_service>::context ctx(this); 
  24.  
  25. return do_one(true, ec); 
  26.  
  27. // Poll for operations without blocking. 
  28. size_t poll(boost::system::error_code& ec) 
  29. if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) 
  30. stop(); 
  31. ec = boost::system::error_code(); 
  32. return 0; 
  33.  
  34. call_stack<win_iocp_io_service>::context ctx(this); 
  35.  
  36. size_t n = 0; 
  37. while (do_one(false, ec)) 
  38. if (n != (std::numeric_limits<size_t>::max)()) 
  39. ++n; 
  40. return n; 
  41.  
  42. // Poll for one operation without blocking. 
  43. size_t poll_one(boost::system::error_code& ec) 
  44. if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) 
  45. stop(); 
  46. ec = boost::system::error_code(); 
  47. return 0; 
  48.  
  49. call_stack<win_iocp_io_service>::context ctx(this); 
  50.  
  51. return do_one(false, ec); 

可以看到,run其实就是一直循环执行do_one,并且是以阻塞方式进行的(参数为true),而run_one同样是以阻塞方式进行的,但只执行一次do_one.poll和run几乎完全相同,只是它是以非阻塞方式执行do_one(参数为false).poll_one是以非阻塞方式执行一次do_one.

(jackwgm)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10554.html]
本文出处:my.oschina.net/jackwgm 作者:jackwgm
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容