﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-帅哥帅-随笔分类-boost</title><link>http://www.cppblog.com/lll109383670/category/18662.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 19 Feb 2012 15:15:22 GMT</lastBuildDate><pubDate>Sun, 19 Feb 2012 15:15:22 GMT</pubDate><ttl>60</ttl><item><title>boost thread 使用笔记</title><link>http://www.cppblog.com/lll109383670/archive/2012/02/19/166010.html</link><dc:creator>帅哥帅</dc:creator><author>帅哥帅</author><pubDate>Sun, 19 Feb 2012 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/lll109383670/archive/2012/02/19/166010.html</guid><wfw:comment>http://www.cppblog.com/lll109383670/comments/166010.html</wfw:comment><comments>http://www.cppblog.com/lll109383670/archive/2012/02/19/166010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lll109383670/comments/commentRss/166010.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lll109383670/services/trackbacks/166010.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 12pt">&nbsp;</span></strong></p>
<p style="margin: 7.5pt 0cm" align="left"><strong><span style="font-family: 宋体">需要用到的头文件：</span></strong></p>
<p style="margin: 7.5pt 0cm" align="left"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&lt;函数类，函数绑定相关</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost</span><span style="color: #000000">/</span><span style="color: #000000">thread</span><span style="color: #000000">/</span><span style="color: #000000">thread.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&lt;线程相关</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost</span><span style="color: #000000">/</span><span style="color: #000000">thread</span><span style="color: #000000">/</span><span style="color: #000000">thread.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&lt;条件变量相关</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost</span><span style="color: #000000">/</span><span style="color: #000000">thread</span><span style="color: #000000">/</span><span style="color: #000000">condition.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p style="margin: 7.5pt 0cm" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left"><strong><span style="font-family: 'Verdana','sans-serif'">boost </span></strong><strong><span style="font-family: 宋体">线程使用：</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left" align="left"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&lt;&nbsp;回调函数</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doFunc(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;str)<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_46_80_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_80_Open_Text.style.display='none'; Codehighlighter1_46_80_Closed_Image.style.display='inline'; Codehighlighter1_46_80_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_80_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_80_Closed_Text.style.display='none'; Codehighlighter1_46_80_Open_Image.style.display='inline'; Codehighlighter1_46_80_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_46_80_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_80_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;</span><span style="color: #000000">%</span><span style="color: #000000">s&#8221;,&nbsp;str);<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&lt;&nbsp;初始化线程回调函数,返回值为void，参数为"hello,&nbsp;boost!"</span><span style="color: #008000"><br /></span><span style="color: #008080">24</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /></span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />boost::function</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;()</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;callBackFunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;boost::bind(doFunc,&nbsp;&#8220;hello,&nbsp;boost</span><span style="color: #000000">!</span><span style="color: #000000">&#8221;)<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&lt;&nbsp;创建线程，线程的同时，线程开始启动</span><span style="color: #008000"><br /></span><span style="color: #008080">32</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /></span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />boost::thread&nbsp;testThread(callBackFunc&nbsp;);<br /></span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />boost::thread::yield()&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&lt;&nbsp;放弃主线程的当前时间片，让test线程可以立刻启动</span><span style="color: #008000"><br /></span><span style="color: #008080">40</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /></span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /></span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />testThread.join()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&lt;&nbsp;等待返回</span><span style="color: #008000"><br /></span><span style="color: #008080">44</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /></span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p style="margin: 7.5pt 0cm; text-align: left" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left"><strong><span style="font-family: 宋体">创建线程组：</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left" align="left"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">boost::thread_group&nbsp;grp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />grp.create_thread(callBackFunc&nbsp;);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />grp.create_thread(callBackFunc&nbsp;);&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />grp.join_all(&nbsp;);</span></div>
<p style="margin: 7.5pt 0cm; text-align: left" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left"><strong><span style="font-family: 宋体">互斥访问：</span></strong></p>
<p style="margin: 7.5pt 0cm" align="left"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">boost::mutex&nbsp;mutex_&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">定义</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">boost::mutext::scoped_lock&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">(mutex_)&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">锁定互斥变量，当该变量的作用范围结束时，会自动解锁mutex_</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p style="margin: 7.5pt 0cm" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left"><strong><span style="font-family: 宋体">条件变量：</span></strong><span style="font-family: 'Verdana','sans-serif'"> </span></p>
<p style="margin: 7.5pt 0cm" align="left"><span style="font-family: 宋体">实现线程间通信，信号量的传递。可以用来补充互斥变量不能完成的功能，比如说特定的条件下才满足的锁定。</span><span style="font-family: 'Verdana','sans-serif'"> </span></p>
<p style="margin: 7.5pt 0cm" align="left"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">boost::condition_variable_any&nbsp;writeCon;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">条件变量&nbsp;</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />writeCon.wait(</span><span style="color: #0000ff">lock</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">等待条件满足&nbsp;</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />writeCon.notify_one();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发送条件满足信号</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p style="margin: 7.5pt 0cm" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left">&nbsp;</p>
<p style="margin: 7.5pt 0cm" align="left"><span style="font-family: 宋体"><strong>只初始化一次的回调函数：</strong></span></p><pre><span style="font-family: 宋体"><div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost</span><span style="color: #000000">/</span><span style="color: #000000">thread</span><span style="color: #000000">/</span><span style="color: #000000">thread.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost</span><span style="color: #000000">/</span><span style="color: #000000">thread</span><span style="color: #000000">/</span><span style="color: #000000">once.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Some&nbsp;sort&nbsp;of&nbsp;connection&nbsp;class&nbsp;that&nbsp;should&nbsp;only&nbsp;be&nbsp;initialized&nbsp;once</span><span style="color: #008000"><br /><img id="Codehighlighter1_172_267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_267_Open_Text.style.display='none'; Codehighlighter1_172_267_Closed_Image.style.display='inline'; Codehighlighter1_172_267_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_172_267_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_172_267_Closed_Text.style.display='none'; Codehighlighter1_172_267_Open_Image.style.display='inline'; Codehighlighter1_172_267_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Conn&nbsp;</span><span id="Codehighlighter1_172_267_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_172_267_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_197_203_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_203_Open_Text.style.display='none'; Codehighlighter1_197_203_Closed_Image.style.display='inline'; Codehighlighter1_197_203_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_197_203_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_203_Closed_Text.style.display='none'; Codehighlighter1_197_203_Open_Image.style.display='inline'; Codehighlighter1_197_203_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(&nbsp;)&nbsp;</span><span id="Codehighlighter1_197_203_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_197_203_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">++</span><span style="color: #000000">i_;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;boost::once_flag&nbsp;init_;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i_;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Conn::i_&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />boost::once_flag&nbsp;Conn::init_&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BOOST_ONCE_INIT;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img id="Codehighlighter1_355_429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_429_Open_Text.style.display='none'; Codehighlighter1_355_429_Closed_Image.style.display='inline'; Codehighlighter1_355_429_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_355_429_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_355_429_Closed_Text.style.display='none'; Codehighlighter1_355_429_Open_Image.style.display='inline'; Codehighlighter1_355_429_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;worker(&nbsp;)&nbsp;</span><span id="Codehighlighter1_355_429_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_355_429_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;boost::call_once(Conn::init,&nbsp;Conn::init_);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Do&nbsp;the&nbsp;real&nbsp;work<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />Conn&nbsp;c;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;You&nbsp;probably&nbsp;don't&nbsp;want&nbsp;to&nbsp;use&nbsp;a&nbsp;global,&nbsp;so&nbsp;see&nbsp;the<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;next&nbsp;Recipe</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;<br /><img id="Codehighlighter1_534_701_Open_Image" onclick="this.style.display='none'; Codehighlighter1_534_701_Open_Text.style.display='none'; Codehighlighter1_534_701_Closed_Image.style.display='inline'; Codehighlighter1_534_701_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_534_701_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_534_701_Closed_Text.style.display='none'; Codehighlighter1_534_701_Open_Image.style.display='inline'; Codehighlighter1_534_701_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(&nbsp;)&nbsp;</span><span id="Codehighlighter1_534_701_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_534_701_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;boost::thread_group&nbsp;grp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grp.create_thread(worker);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;grp.join_all(&nbsp;);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;c.i_&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;c.i_&nbsp;=&nbsp;1</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">使用前，必须先定义boost::once_flag，不能为临时变量<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">代码来自《C++&nbsp;cookbook》</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>参考文章：<a href="http://www.cppblog.com/shaker/archive/2007/10/06/33583.html">http://www.cppblog.com/shaker/archive/2007/10/06/33583.html</a></span></pre><img src ="http://www.cppblog.com/lll109383670/aggbug/166010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lll109383670/" target="_blank">帅哥帅</a> 2012-02-19 22:48 <a href="http://www.cppblog.com/lll109383670/archive/2012/02/19/166010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>