asio 中strand的作用

[cpp] view plain copy

 
 print?

  1. namespace  
  2. {  
  3.     // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行.   
  4.     // io_service不能保证线程安全  
  5.     boost::asio::io_service m_service;  
  6.     boost::asio::strand m_strand(m_service);  
  7.     boost::mutex m_mutex;  
  8.   
  9.     void print(int id)  
  10.     {  
  11.         // boost::mutex::scoped_lock lock(m_mutex);  
  12.         static int count = 0;  
  13.         PRINT_DEBUG("id: " << boost::lexical_cast<std::string>(id));  
  14.         PRINT_DEBUG("count: " << boost::lexical_cast<std::string>(++count));  
  15.     }  
  16.       
  17.     void ioRun1()  
  18.     {  
  19.         while(true)  
  20.         {  
  21.             m_service.run();  
  22.         }  
  23.     }  
  24.   
  25.     void ioRun2()  
  26.     {  
  27.         while(true)  
  28.         {  
  29.             m_service.run();  
  30.         }  
  31.     }  
  32.   
  33.     void strand_print1()  
  34.     {  
  35.         // PRINT_DEBUG("Enter print1");  
  36.         m_strand.dispatch(boost::bind(print, 1));  
  37.         // PRINT_DEBUG("Exit print1");  
  38.     }  
  39.   
  40.     void strand_print2()  
  41.     {  
  42.         // PRINT_DEBUG("Enter print2");  
  43.         m_strand.post(boost::bind(print, 2));  
  44.         // PRINT_DEBUG("Exit print2");  
  45.     }  
  46.   
  47.     void strand_print3()  
  48.     {  
  49.         // PRINT_DEBUG("Enter print3");                
  50.         m_strand.post(boost::bind(print, 3));  
  51.         // PRINT_DEBUG("Exit print3");  
  52.     }  
  53.   
  54.     void strand_print4()  
  55.     {  
  56.         // PRINT_DEBUG("Enter print4");  
  57.         m_strand.post(boost::bind(print, 4));  
  58.         // PRINT_DEBUG("Exit print4");  
  59.     }  
  60.   
  61.     // 将上面的m_strand换成m_service后,  
  62.     void service_print1()  
  63.     {  
  64.         // PRINT_DEBUG("Enter print1");  
  65.         m_service.dispatch(boost::bind(print, 1));  
  66.         // PRINT_DEBUG("Exit print1");  
  67.     }  
  68.   
  69.     void service_print2()  
  70.     {  
  71.         // PRINT_DEBUG("Enter print2");  
  72.         m_service.post(boost::bind(print, 2));  
  73.         // PRINT_DEBUG("Exit print2");  
  74.     }  
  75.   
  76.     void service_print3()  
  77.     {  
  78.         // PRINT_DEBUG("Enter print3");                
  79.         m_service.post(boost::bind(print, 3));  
  80.         // PRINT_DEBUG("Exit print3");  
  81.     }  
  82.   
  83.     void service_print4()  
  84.     {  
  85.         // PRINT_DEBUG("Enter print4");  
  86.         m_service.post(boost::bind(print, 4));  
  87.         // PRINT_DEBUG("Exit print4");  
  88.     }  
  89. }  
  90.   
  91. void test_strand()  
  92. {  
  93.     boost::thread ios1(ioRun1);  
  94.     boost::thread ios2(ioRun2);  
  95.       
  96.     boost::thread t1(strand_print1);  
  97.     boost::thread t2(strand_print2);  
  98.     boost::thread t3(strand_print3);  
  99.     boost::thread t4(strand_print4);  
  100.   
  101.     t1.join();  
  102.     t2.join();  
  103.     t3.join();  
  104.     t4.join();  
  105.   
  106.     m_server.run();  
  107. }  
  108.   
  109. void test_service()  
  110. {  
  111.     boost::thread ios1(ioRun1);  
  112.     boost::thread ios2(ioRun2);  
  113.   
  114.     boost::thread t1(service_print1);  
  115.     boost::thread t2(service_print2);  
  116.     boost::thread t3(service_print3);  
  117.     boost::thread t4(service_print4);  
  118.       
  119.     t1.join();  
  120.     t2.join();  
  121.     t3.join();  
  122.     t4.join();  
  123.       
  124.     m_service.run();  
  125. }  

test_strand的执行结果:

[cpp] view plain copy

 

 print?

  1. 2013-01-05 17:25:34 626 [8228] DEBUG - id: 4  
  2. 2013-01-05 17:25:34 631 [8228] DEBUG - count: 1  
  3. 2013-01-05 17:25:34 634 [5692] DEBUG - id: 1  
  4. 2013-01-05 17:25:34 637 [5692] DEBUG - count: 2  
  5. 2013-01-05 17:25:34 640 [5692] DEBUG - id: 2  
  6. 2013-01-05 17:25:34 642 [5692] DEBUG - count: 3  
  7. 2013-01-05 17:25:34 646 [5692] DEBUG - id: 3  
  8. 2013-01-05 17:25:34 649 [5692] DEBUG - count: 4  

test_ioserivice的执行结果:

[cpp] view plain copy

 

 print?

  1. 2013-01-05 17:26:28 071 [3236] DEBUG - id: 1  
  2. 2013-01-05 17:26:28 071 [5768] DEBUG - id: 2  
  3. 2013-01-05 17:26:28 071 [5108] DEBUG - id: 3  
  4. 2013-01-05 17:26:28 076 [3236] DEBUG - count: 1  
  5. 2013-01-05 17:26:28 079 [5768] DEBUG - count: 2  
  6. 2013-01-05 17:26:28 083 [5108] DEBUG - count: 3  
  7. 2013-01-05 17:26:28 087 [3236] DEBUG - id: 4  
  8. 2013-01-05 17:26:28 099 [3236] DEBUG - count: 4  

从结果可以看到, 在test_strand中print中两个打印函数成对执行, 在test_ioservice两个打印函数就没有线程安全可言了.
如果要保证test_ioservice同步, 就要加上mutex, 在代码中被注释的那句. 

注意从日志的线程号中可知: 真正执行print()是主线程, ios1, ios2, 而t1, t2, t3, t4线程只是往ioservice的队列中加入任务.

时间: 2024-10-02 03:32:32

asio 中strand的作用的相关文章

Ext中namespace的作用

Ext中在每一个页面中添加一个namespace呢,就像下面的代码: // create namespace Ext.namespace('myNameSpace'); // create application myNameSpace.app = function() { // do NOT access DOM from here; elements don't exist yet // private variables // private functions // public spa

JavaScript中isPrototypeOf函数作用和使用实例

  这篇文章主要介绍了JavaScript中isPrototypeOf函数作用和使用实例,本文讲解了它的作用和使用方法以及使用实例,需要的朋友可以参考下 JavaScript中isPrototypeOf函数方法是返回一个布尔值,指出对象是否存在于另一个对象的原型链中.使用方法: 代码如下: object1.isPrototypeOf(object2) 其中object1为必选项,一个对象的实例. object2为必选项,另一个对象,将要检查其原型链. 如果 object2 的 原型链中包含obj

javascript中defer的作用

 这篇文章主要是对javascript中defer的作用进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 很多人都已经把 Javascript的用的炉火纯青了,但见到defer未必就知道他是做什么用的:很多人也都遇到过这样的问题,需要直接执行别且操作DOM对象的js 总是报找不到对象的错误,原因大家也都知道就是页面还有没有加载完毕,js的操作对象还在下载中.但很多人都不知道,添加defer标签就能轻而易举的解决这个问题.   <script src="../CGI-bin

javascript中return的作用

 这篇文章主要介绍了javascript中return的作用,有需要的朋友可以参考一下 这里面的return含有一些细节知识:   例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别   JAVASCRIPT在事件中调用函数时用return返回值实际上是对window.event.returnvalue进行设置.   而该值决定了当前操作是否继续. 当返回的是true时,将继续操作. 当返回是false时,将中断操作.  

js中top的作用深入剖析

本篇文章主要是对js中top的作用进行了深入的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 每一个WINDOW对象,不论他是常规HTML页面.框架集页面.子框架还是孙子框架,都具有一个TOP属性.这个属性返回对载入浏览器得最顶层WINDOE对象得引用; .如果WINDOW对象是常规HTML页面,TOP就是SELF .......顶层框架及页面, ........ .......子框架,TOP指向框架得父亲,也就是说,下面两个表达式是等效的; SELF.TOP SELF.PARENT .如果

maven依赖关系中Scope的作用

原文:http://peak.iteye.com/blog/299225 maven依赖关系中Scope的作用 Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值:     * compile,缺省值,适用于所有阶段,会随着项目一起发布.     * provided,类似compile,期望JDK.容器或使用者会提供这个依赖.如servlet.jar.     *

java中构造器的作用?

问题描述 java中构造器的作用? java中构造器的作用是什么?可以生动形象些解释吗?!(专业的术语不理解) 解决方案 1.创建java对象的重要途径. 2.对系统产生的对象初始化 3.并将该对象作为返回值返回,是外部程序可以访问. 解决方案二: http://baike.baidu.com/link?url=cxOmwyIsaR2Frw7XKdTbmE43s5EpVWHOwypDk7MBx_eb3THeMaXawPdEiwP8VcACKobuwuaYZQESU1Ah2TUKKq 简单讲,生孩

金融发展在经济结构调整中的重要作用

本文讲的是金融发展在经济结构调整中的重要作用,2011年9月1号, 以"创新融合 稳健提升"为主题的2011中国国际金融展(以下简称金融展)在京拉开帷幕. 在金融展上来自人民银行.银监会.证监会.保监会"一行三会"领导齐聚金融展,且将分别为本届金融展致开幕辞,并共同启动开幕仪式. 在2011金融展发展论坛上,来自金融行业的专家就金融的发展现状进行了分享. 以下是来自中国人民银行行长助理.党委委员,李东荣就<金融发展在经济结构调整和发展方式转变中的重要作用>

js-新手问:ssh中BaseAction的作用

问题描述 新手问:ssh中BaseAction的作用 public class BaseAction extends ActionSupport { public String jsonString;public void outJsonString(String str) { getResponse().setContentType(""text/javascript;charset=UTF-8""); outString(str);}/* * public vo