免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9122 | 回复: 4
打印 上一主题 下一主题

求教 asio中strand的post和dispatch的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-30 17:15 |只看该作者 |倒序浏览
RT 求教 这2个接口的详细区别

先谢谢了

论坛徽章:
0
2 [报告]
发表于 2011-11-30 17:32 |只看该作者
看boost文档或者代码。

http://www.boost.org/doc/libs/1_ ... rvice/dispatch.html
http://www.boost.org/doc/libs/1_ ... o_service/post.html

post不管什么情况都会把任务丢到队列中,然后立即返回。
dispatch如果跟run()在一个线程,那么任务会直接在dispatch内部调用,执行结束后返回。不在一个线程跟post一样。

论坛徽章:
0
3 [报告]
发表于 2011-11-30 18:03 |只看该作者
本帖最后由 tweyseo 于 2011-11-30 23:12 编辑

回复 2# nth2say


    恩 我看了下代码 可是还有2个疑问:
    第一按照这样的话,我下面的代码应该是dispatch那边的话 应该是先打印数字在打印"dispatch",可是实际上是反过来的.
  1. boost::asio::io_service io_ser;
  2. boost::asio::strand schedule(io_ser);
  3. boost::mutex io_mutex;

  4. void counter(int id)
  5. {
  6.         boost::mutex::scoped_lock lock(io_mutex);
  7.         std::cout << "I'm in thread[" << id << "]" << std::endl;
  8. }

  9. void NewThreadPost(int id)
  10. {
  11.         schedule.post(schedule.wrap(boost::bind(&counter, id)));
  12.         boost::mutex::scoped_lock lock(io_mutex);
  13.         std::cout << "post." << std::endl;
  14. }

  15. void NewThreadDispatch(int id)
  16. {
  17.         schedule.dispatch(schedule.wrap(boost::bind(&counter, id)));
  18.         boost::mutex::scoped_lock lock(io_mutex);
  19.         std::cout << "dispatch." << std::endl;
  20. }

  21. int main()
  22. {
  23.         boost::thread_group tg;

  24.         //tg.create_thread(boost::bind(&NewThreadDispatch, 1));
  25.        
  26.         tg.create_thread(boost::bind(&NewThreadPost, 2));
  27.         NewThreadDispatch(1);
  28.        
  29.         io_ser.run();
  30.         //tg.join_all();

  31.         return 0;
  32. }
复制代码
第二,我看dispatch的代码还有一段
  1. // If we are already in the strand then the handler can run immediately.
  2.     if (call_stack<strand_impl>::contains(impl))
  3.     {
  4.       boost::asio::detail::fenced_block b;
  5.       boost_asio_handler_invoke_helpers::invoke(handler, handler);
  6.       return;
  7.     }
复制代码
这个又是在说明一种和post不同的地方,但是具体是什么呢?

论坛徽章:
0
4 [报告]
发表于 2011-12-01 12:47 |只看该作者
回复  nth2say


    恩 我看了下代码 可是还有2个疑问:
    第一按照这样的话,我下面的代码应该是dis ...
tweyseo 发表于 2011-11-30 18:03



你打印dispatch是直接打印的,又不是通过asio打印的。。

论坛徽章:
0
5 [报告]
发表于 2011-12-01 12:53 |只看该作者
不晓得asio怎样,俺这两天玩boost::spirit,被玩趴下了。
转入 yacc/lex 的怀抱,突然有种死后超生的感觉
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP