锘??xml version="1.0" encoding="utf-8" standalone="yes"?>韩日精品在线,亚洲网址在线,老色鬼精品视频在线观看播放http://www.shnenglu.com/ant/The dreams in which I'm dying are the best I've ever had...zh-cnWed, 24 Sep 2025 01:35:18 GMTWed, 24 Sep 2025 01:35:18 GMT60strlen婧愮爜鍓栨瀽http://www.shnenglu.com/ant/archive/2007/10/12/32886.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 12 Oct 2007 05:19:00 GMThttp://www.shnenglu.com/ant/archive/2007/10/12/32886.htmlhttp://www.shnenglu.com/ant/comments/32886.htmlhttp://www.shnenglu.com/ant/archive/2007/10/12/32886.html#Feedback34http://www.shnenglu.com/ant/comments/commentRss/32886.htmlhttp://www.shnenglu.com/ant/services/trackbacks/32886.html闃呰鍏ㄦ枃

]]>
TEA鍔犲瘑綆楁硶鐨凜/C++瀹炵幇http://www.shnenglu.com/ant/archive/2007/10/12/31326.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 12 Oct 2007 05:17:00 GMThttp://www.shnenglu.com/ant/archive/2007/10/12/31326.htmlhttp://www.shnenglu.com/ant/comments/31326.htmlhttp://www.shnenglu.com/ant/archive/2007/10/12/31326.html#Feedback14http://www.shnenglu.com/ant/comments/commentRss/31326.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31326.html闃呰鍏ㄦ枃

]]>
Win32 Service鐨勭畝鍗曞皝瑁?/title><link>http://www.shnenglu.com/ant/archive/2007/09/24/32769.html</link><dc:creator>铓傝殎緇堢粨鑰?/dc:creator><author>铓傝殎緇堢粨鑰?/author><pubDate>Mon, 24 Sep 2007 05:01:00 GMT</pubDate><guid>http://www.shnenglu.com/ant/archive/2007/09/24/32769.html</guid><wfw:comment>http://www.shnenglu.com/ant/comments/32769.html</wfw:comment><comments>http://www.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/ant/comments/commentRss/32769.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ant/services/trackbacks/32769.html</trackback:ping><description><![CDATA[<p>鍓嶆鏃墮棿瀛︿範(fàn)Windows紼嬪簭璁捐錛屽垰濂藉鍒癢in32 Service錛屼簬鏄啓浜?jiǎn)涓や釜绠鍗曠殑綾伙細(xì)BaseService鍜孲erviceCtrl銆傝櫧鐒跺姛鑳芥瘮杈冪畝鍗曪紝浣嗘槸涔熻兘閫傜敤浜庡ぇ澶氭暟鎯呭喌銆備笅闈粙緇嶄竴涓嬬畝鍗曠敤娉曪紝濡傛灉浣犲垰濂介渶瑕佸啓涓浜涚畝鍗曠殑鏈嶅姟紼嬪簭錛岃繖涓や釜綾諱篃璁歌兘媧句笂鐢ㄥ満錛?br><br><span style="FONT-SIZE: 14pt"><strong style="COLOR: #993366">1. BaseService<br></strong></span><em style="COLOR: #333399">BaseService.h<br></em></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"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef BASE_SERVICE_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define BASE_SERVICE_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span></font> <font face="Courier New"><span style="COLOR: #000000"> BaseService {<br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 6</span> </font> <font face="Courier New"><span style="COLOR: #000000">    explicit BaseService(LPCTSTR szServiceName,<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">                DWORD dwServiceType </span><span style="COLOR: #000000">=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_WIN32_OWN_PROCESS,<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">                DWORD dwStartType </span><span style="COLOR: #000000">=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_AUTO_START);<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #000000">~</span></font> <font face="Courier New"><span style="COLOR: #000000">BaseService() {}<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    bool ParseStandardArgs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000"> argv[]);<br></span><span style="COLOR: #008080">11</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool IsInstalled();<br></span><span style="COLOR: #008080">12</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Install();<br></span><span style="COLOR: #008080">13</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Uninstall();<br></span><span style="COLOR: #008080">14</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Start();<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Run() </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    virtual bool OnInitialize() { </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnStop() {}<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnPause() {}<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnContinue() {}<br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnInterrogate() {}<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnShutdown() {}<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnUserControl(DWORD dwControl) {}<br></span><span style="COLOR: #008080">24</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ...<br></span><span style="COLOR: #008080">25</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">26</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">BASE_SERVICE_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>瑕佸疄鐜拌嚜宸辯殑鏈嶅姟綾誨彧闇浠嶣aseService緇ф壙騫朵笖Override鐩稿叧鐨剉irtual鍑芥暟鍗沖彲錛屼笅闈㈢ず鑼冧竴涓狟eepService綾伙紝璇ユ湇鍔″彧鏄畝鍗曞湴姣忛殧2縐抌eep涓涓嬶紝涓轟簡(jiǎn)綆鍗曟墍鏈変唬鐮佸潎鏀懼湪.h鏂囦歡涓細(xì)<br><em style="COLOR: #333399">BeepService.h</em></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"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef BEEP_SERVICE_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define BEEP_SERVICE_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BaseService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BeepService : </span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000"> BaseService {<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 8</span> </font> <font face="Courier New"><span style="COLOR: #000000">    BeepService(LPCTSTR szServiceName)<br></span><span style="COLOR: #008080"> 9</span> </font> <font face="Courier New"><span style="COLOR: #000000">        :BaseService(szServiceName)<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        ,m_bPaused(</span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">        ,m_bRunning(</span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">) {}<br></span><span style="COLOR: #008080">12</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnStop() { m_bRunning </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnPause() { m_bPaused </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnContinue() { m_bPaused </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> Run() {<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">        m_bRunning </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">while</span></font> <font face="Courier New"><span style="COLOR: #000000"> (m_bRunning) {<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">m_bPaused)<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">                Beep(</span><span style="COLOR: #000000">800</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">800</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">2000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">22</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">23</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span></font> <font face="Courier New"><span style="COLOR: #000000"> bool m_bPaused;<br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span></font> <font face="Courier New"><span style="COLOR: #000000"> bool m_bRunning;<br></span><span style="COLOR: #008080">27</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">28</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">BEEP_SERVICE_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>閫氬父鏉ヨ鍙』瑕丱verride涓婇潰鐨?涓獀irtual鍑芥暟灝監(jiān)K浜?jiǎn)锛?xì)<br>鍦?em>Run()</em>涓繘琛屽疄闄呯殑宸ヤ綔錛?em>OnStop(),OnPause(),OnContinue()</em>鍒欐槸涓轟簡(jiǎn)鍝嶅簲Service Control Manager鐨勬帶鍒躲?br><em style="COLOR: #333399"><br>test.cpp<br></em></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"><font face="Courier New"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">tchar.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000">argv[]) {<br></span><span style="COLOR: #008080"> 7</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    BeepService beepService(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">beepService.ParseStandardArgs(argc, argv)) {<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span></font> <font face="Courier New"><span style="COLOR: #000000"> (beepService.IsInstalled()) {<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">beepService.Start())<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">                printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The service can not run from command line.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">        } </span><span style="COLOR: #0000ff">else</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The service is not installed, </span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">                </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">use \</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">s </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> to install.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, argv[</span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">16</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">17</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">}</span></font> </div> <p>鍋囪緙栬瘧鍚庣敓鎴愮殑exe鏂囦歡涓篵eep.exe錛屽垯鍦ㄥ懡浠よ涓彲浠ュ涓嬩嬌鐢細(xì)<br><em style="COLOR: #333399">(1). beep -i    瀹夎service(瀹夎浠ュ悗緋葷粺榪愯鏃朵細(xì)鑷姩鍚姩)<br>(2). beep -u   鍗歌澆service(濡傛灉service姝e湪榪愯錛屽垯鍏堝仠姝ervice鍐嶅嵏杞?<br></em>BaseServiced 鐨凱arseStandardArgs姝f槸鐢ㄦ潵瑙f瀽涓婅堪涓や釜鍛戒護(hù)銆?br><br><span style="FONT-SIZE: 14pt"><strong style="COLOR: #993366">2. ServiceCtrl<br></strong></span>铏界劧Windows鑷甫鐨凷ervice Control Manager鍙互鎺у埗鏈嶅姟紼嬪簭錛屼絾鏄緢澶氭椂鍊欐垜浠兘闇瑕佺敤浠g爜鎺у埗錛岃繖灝辯敤鍒癝erviceCtrl綾伙紝璇ョ被鐨勬帴鍙e涓嬶細(xì)<br><em style="COLOR: #333399">ServiceCtrl.h</em></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"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef SERVICE_CTRL_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define SERVICE_CTRL_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span></font> <font face="Courier New"><span style="COLOR: #000000"> ServiceCtrl {<br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 6</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ServiceCtrl(LPCTSTR szServiceName);<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">    </span><span style="COLOR: #000000">~</span></font> <font face="Courier New"><span style="COLOR: #000000">ServiceCtrl();<br></span><span style="COLOR: #008080"> 8</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Start();<br></span><span style="COLOR: #008080"> 9</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Pause();<br></span><span style="COLOR: #008080">10</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Continue();<br></span><span style="COLOR: #008080">11</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Stop();<br></span><span style="COLOR: #008080">12</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Interrogate();<br></span><span style="COLOR: #008080">13</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool UserControl(DWORD dwControl);<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    DWORD State() </span><span style="COLOR: #0000ff">const</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ...<br></span><span style="COLOR: #008080">16</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">17</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">SERVICE_CTRL_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>鎺ュ彛姣旇緝鐩磋娌′粈涔堝ソ璇寸殑錛岀湅涓嬮潰鐨勭ず渚嬩唬鐮侊細(xì)<br><em><font color=#333399>test.cpp</font></em></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"><font face="Courier New"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">tchar.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">exception</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ServiceCtrl.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 7</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000">argv[]) {<br></span><span style="COLOR: #008080"> 9</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">try</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">        ServiceCtrl servCtrl(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (servCtrl.State() </span><span style="COLOR: #000000">!=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_STOPPED) {<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Service already started.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        } </span><span style="COLOR: #0000ff">else</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">15</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Start();<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Start.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">18</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Pause();<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Pause.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Continue();<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Continue.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">24</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Stop();<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Stop.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">26</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">    } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (std::exception </span><span style="COLOR: #000000">&</span></font> <font face="Courier New"><span style="COLOR: #000000">e) {<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">, e.what());<br></span><span style="COLOR: #008080">29</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">}</span></font> </div> <br>婧愪唬鐮侊細(xì)<a title=鐐瑰嚮涓嬭澆 href="http://www.shnenglu.com/Files/ant/Service.rar">鐐瑰嚮涓嬭澆</a><br> <img src ="http://www.shnenglu.com/ant/aggbug/32769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ant/" target="_blank">铓傝殎緇堢粨鑰?/a> 2007-09-24 13:01 <a href="http://www.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>MD5綆楁硶鐨凜++瀹炵幇http://www.shnenglu.com/ant/archive/2007/09/11/31886.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Tue, 11 Sep 2007 04:20:00 GMThttp://www.shnenglu.com/ant/archive/2007/09/11/31886.htmlhttp://www.shnenglu.com/ant/comments/31886.htmlhttp://www.shnenglu.com/ant/archive/2007/09/11/31886.html#Feedback121http://www.shnenglu.com/ant/comments/commentRss/31886.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31886.html闃呰鍏ㄦ枃

]]>
闈炲畬緹嶤++ Singleton瀹炵幇[2]http://www.shnenglu.com/ant/archive/2007/09/07/31786.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 07 Sep 2007 15:22:00 GMThttp://www.shnenglu.com/ant/archive/2007/09/07/31786.htmlhttp://www.shnenglu.com/ant/comments/31786.htmlhttp://www.shnenglu.com/ant/archive/2007/09/07/31786.html#Feedback13http://www.shnenglu.com/ant/comments/commentRss/31786.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31786.html4.瑙e喅澶氱嚎紼嬮棶棰?br />涓婁竴綃囧疄鐜扮殑Singleton鍙兘鍦ㄥ崟綰跨▼鐜涓嬌鐢紝鍦ㄥ綰跨▼鐜涓細(xì)鍑虹幇寰堝闂錛岀湅Instance()瀹炵幇浠g爜錛?br />
1聽(tīng)static聽(tīng)Singleton&聽(tīng)I(yíng)nstance()聽(tīng){
2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==聽(tīng)_instance)聽(tīng){聽(tīng)//1

3聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)new聽(tīng)Singleton();聽(tīng)//2
4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)atexit(Destroy);
5聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
6聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)*_instance;聽(tīng)//3

7聽(tīng)}
鑰冭檻濡備笅鎯呭喌錛氱嚎紼嬩竴璋冪敤Instance()錛岃繘鍏?/1錛? == _instance 榪斿洖true錛岀嚎紼嬩竴浜庢槸榪涘叆//2銆傝繖鏃跺欑嚎紼嬩竴琚寕璧鳳紝綰跨▼浜屽紑濮嬫墽琛岋紝綰跨▼浜岃皟鐢↖nstance()錛岃繘鍏?/1錛屽彂鐜? == _instance 浠嶇劧榪斿洖true錛岀嚎紼嬩簩浜庢槸涔熻繘鍏?/2錛岀嚎紼嬩簩緇х畫鎵ц鍒?/3鐩村埌榪斿洖銆傝繖鏃跺欑嚎紼嬩竴琚敜閱掞紝緇х畫浠?/2寮濮嬫墽琛岋紝榪欏皢浼?xì)瑕嗙洊绾拷E嬩簩鍒涘緩鐨刜instance錛岀嚎紼嬩竴緇х畫鎵ц鍒?/3鐩村埌榪斿洖...

瑙e喅鏂規(guī)硶寰堢畝鍗曪紝寮曞叆鐩稿叧鍚屾瀵硅薄(synchronization object)灝辮浜?jiǎn)锛屼緥濡傚湪win32騫沖彴涓嬪彲浠ュ涓嬪疄鐜幫細(xì)
synobj.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)SYNOBJ_H
聽(tīng)2聽(tīng)
#define聽(tīng)SYNOBJ_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)#include聽(tīng)<windows.h>
聽(tīng)5聽(tīng)
聽(tīng)6聽(tīng)#define聽(tīng)CLASS_UNCOPYABLE(classname)聽(tīng)\
聽(tīng)7聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)private
:聽(tīng)\
聽(tīng)8聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname(const聽(tīng)classname&
);聽(tīng)\
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname&聽(tīng)operator=(const聽(tīng)classname&
);
10聽(tīng)

11聽(tīng)class聽(tīng)Mutex聽(tīng){
12聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(Mutex)
13聽(tīng)public
:
14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Mutex()聽(tīng):_cs()聽(tīng){聽(tīng)I(yíng)nitializeCriticalSection(&
_cs);聽(tīng)}
15聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~Mutex()聽(tīng){聽(tīng)DeleteCriticalSection(&
_cs);聽(tīng)}
16聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void聽(tīng)lock()聽(tīng){聽(tīng)EnterCriticalSection(&
_cs);聽(tīng)}
17聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void聽(tīng)unlock()聽(tīng){聽(tīng)LeaveCriticalSection(&
_cs);聽(tīng)}
18聽(tīng)private
:
19聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CRITICAL_SECTION聽(tīng)_cs;
20聽(tīng)
};
21聽(tīng)

22聽(tīng)class聽(tīng)Lock聽(tīng){
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(Lock)
24聽(tīng)public
:
25聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)explicit聽(tīng)Lock(Mutex&
聽(tīng)cs)聽(tīng):_cs(cs)聽(tīng){聽(tīng)_cs.lock();聽(tīng)}
26聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~
Lock()聽(tīng){聽(tīng)_cs.unlock();聽(tīng)}
27聽(tīng)private
:
28聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Mutex&
聽(tīng)_cs;
29聽(tīng)
};
30聽(tīng)

31聽(tīng)#endif/*SYNOBJ_H*/

鏈変簡(jiǎn)鍚屾瀵硅薄寰堝鏄撳氨鑳藉鍐欏嚭濡備笅浠g爜錛?br />singleton.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)SINGLETON_H
聽(tīng)2聽(tīng)
#define聽(tīng)SINGLETON_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)#include聽(tīng)"synobj.h"
聽(tīng)5聽(tīng)
聽(tīng)6聽(tīng)class聽(tīng)Singleton聽(tīng){
聽(tīng)7聽(tīng)public
:
聽(tīng)8聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)Singleton&聽(tīng)I(yíng)nstance()聽(tīng){聽(tīng)//聽(tīng)Unique聽(tīng)point聽(tīng)of聽(tīng)access

聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Lock聽(tīng)lock(_mutex);
10聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==
聽(tīng)_instance)聽(tīng){
11聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)new
聽(tīng)Singleton();
12聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)atexit(Destroy);聽(tīng)//聽(tīng)Register聽(tīng)Destroy聽(tīng)function

13聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)*
_instance;
15聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
16聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)DoSomething(){}
17聽(tīng)private
:
18聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)void聽(tīng)Destroy()聽(tīng){聽(tīng)//聽(tīng)Destroy聽(tīng)the聽(tīng)only聽(tīng)instance

19聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(聽(tīng)_instance聽(tīng)!=聽(tīng)0聽(tīng))聽(tīng){
20聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)delete聽(tīng)_instance;
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)0
;
22聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
24聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Singleton(){}聽(tīng)//聽(tīng)Prevent聽(tīng)clients聽(tīng)from聽(tīng)creating聽(tīng)a聽(tīng)new聽(tīng)Singleton

25聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~Singleton(){}聽(tīng)//聽(tīng)Prevent聽(tīng)clients聽(tīng)from聽(tīng)deleting聽(tīng)a聽(tīng)Singleton
26聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Singleton(const聽(tīng)Singleton&);聽(tīng)//聽(tīng)Prevent聽(tīng)clients聽(tīng)from聽(tīng)copying聽(tīng)a聽(tīng)Singleton
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Singleton&聽(tīng)operator=(const聽(tīng)Singleton&);
28聽(tīng)private
:
29聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static
聽(tīng)Mutex聽(tīng)_mutex;
30聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)Singleton聽(tīng)*_instance;聽(tīng)//聽(tīng)The聽(tīng)one聽(tīng)and聽(tīng)only聽(tīng)instance

31聽(tīng)};
32聽(tīng)

33聽(tīng)#endif/*SINGLETON_H*/

singleton.cpp
1聽(tīng)#include聽(tīng)"singleton.h"
2聽(tīng)
3聽(tīng)Mutex聽(tīng)Singleton::_mutex;
4聽(tīng)Singleton*聽(tīng)Singleton::_instance聽(tīng)=聽(tīng)0;
鐜板湪鐨凷ingleton铏界劧澶氱嚎紼嬪畨鍏紝鎬ц兘鍗村彈鍒頒簡(jiǎn)褰卞搷銆備粠Instance()涓彲浠ョ湅鍒幫紝瀹為檯涓婁粎浠呭綋0 == _instance涓簍rue鏃舵墠闇瑕丩ock銆備綘寰堝鏄撳氨鍐欏嚭濡備笅浠g爜錛?br />
1聽(tīng)static聽(tīng)Singleton&聽(tīng)I(yíng)nstance()聽(tīng){
2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==
聽(tīng)_instance)聽(tīng){
3聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Lock聽(tīng)lock(_mutex);
4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)new
聽(tīng)Singleton();
5聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)atexit(Destroy);
6聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
7聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)*
_instance;
8聽(tīng)}
浣嗘槸榪欐牱榪樻槸浼?xì)漶旂敓绔炰簤鏉′?race condition)錛屼竴縐嶅箍涓轟漢鐭ョ殑鍋氭硶鏄嬌鐢ㄦ墍璋撶殑Double-Checked Locking錛?br />
聽(tīng)1聽(tīng)static聽(tīng)Singleton&聽(tīng)I(yíng)nstance()聽(tīng){
聽(tīng)2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==
聽(tīng)_instance)聽(tīng){
聽(tīng)3聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Lock聽(tīng)lock(_mutex);
聽(tīng)4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==
聽(tīng)_instance)聽(tīng){
聽(tīng)5聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)new
聽(tīng)Singleton();
聽(tīng)6聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)atexit(Destroy);
聽(tīng)7聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)8聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)*
_instance;
10聽(tīng)}
Double-Checked Locking鏈哄埗鐪嬭搗鏉ュ儚鏄竴涓畬緹庣殑瑙e喅鏂規(guī)錛屼絾鏄湪鏌愪簺鏉′歡涓嬩粛鐒朵笉琛屻傜畝鍗曠殑璇達(dá)紝緙栬瘧鍣ㄤ負(fù)浜?jiǎn)鏁堢巼鍙兘浼?xì)閲嶆帓鎸囦護(hù)鐨勬墽琛岄『搴?compiler-based reorderings)銆傜湅榪欎竴琛屼唬鐮侊細(xì)

_instance聽(tīng)=聽(tīng)new聽(tīng)Singleton();

鍦ㄧ紪璇戝櫒鏈紭鍖栫殑鎯呭喌涓嬮『搴忓涓嬶細(xì)
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍦ㄥ垎閰嶇殑鍐呭瓨?shù)笂鏋勯燬ingleton瀵硅薄錛?br />3.鍐呭瓨鍦板潃璧嬪肩粰_instance銆?/span>

浣嗘槸褰撶紪璇戝櫒浼樺寲鍚庢墽琛岄『搴忓彲鑳藉涓嬶細(xì)
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍐呭瓨鍦板潃璧嬪肩粰_instance錛?br />3.鍦ㄥ垎閰嶇殑鍐呭瓨?shù)笂鏋勯燬ingleton瀵硅薄銆?/span>

褰撶紪璇戝櫒浼樺寲鍚庯紝濡傛灉綰跨▼涓鎵ц鍒?鍚庤鎸傝搗銆傜嚎紼嬩簩寮濮嬫墽琛屽茍鍙戠幇0 == _instance涓篺alse錛屼簬鏄洿鎺eturn錛岃岃繖鏃禨ingleton瀵硅薄鍙兘榪樻湭鏋勯犲畬鎴愶紝鍚庢灉...

涓婇潰璇寸殑榪樺彧鏄崟澶勭悊鍣ㄧ殑鎯呭喌錛屽湪澶氬鐞嗗櫒(multiprocessors)鐨勬儏鍐典笅錛岃秴綰跨▼鎶鏈繀鐒朵細(xì)娣峰悎鎵ц鎸囦護(hù)錛屾寚浠ょ殑鎵ц欏哄簭鏇存棤娉曚繚闅溿傚叧浜?span style="COLOR: #333399">Double-Checked Locking
鐨勬洿璇︾粏鐨勬枃绔狅紝璇風(fēng)湅錛?br />The "Double-Checked Locking is Broken" Declaration

5.浣跨敤volatile鍏抽敭瀛?br />涓轟簡(jiǎn)璇存槑闂錛岃鍏堣冭檻濡備笅浠g爜錛?br />
聽(tīng)1聽(tīng)class聽(tīng)MyThread聽(tīng):聽(tīng)public聽(tīng)Thread聽(tīng){
聽(tīng)2聽(tīng)public
:
聽(tīng)3聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){
聽(tīng)4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)while聽(tīng)(!
_stopped)聽(tīng){
聽(tīng)5聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//do聽(tīng)something

聽(tīng)6聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)7聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)8聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)stop()聽(tīng){
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_stopped聽(tīng)=聽(tīng)true
;
10聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
11聽(tīng)private
:
12聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)bool聽(tīng)_stopped;
13聽(tīng)
};
14聽(tīng)

15聽(tīng)...
16聽(tīng)
17聽(tīng)MyThread聽(tīng)thread;
18聽(tīng)thread.start();
涓婇潰鐢╰hread.start()寮鍚簡(jiǎn)涓涓嚎紼嬶紝璇ョ嚎紼嬪湪while寰幆涓嫻媌ool鏍囪_stopped錛岀湅鏄惁璇ョ戶緇墽琛屻傚鏋滄兂瑕佺粨鏉熻繖涓嚎紼嬶紝璋冪敤thread.stop()搴旇娌¢棶棰樸備絾鏄渶瑕佹敞鎰忕殑鏄紪璇戝櫒寰堟湁鍙兘瀵筥stopped鐨勫瓨鍙栬繘琛屼紭鍖栥傚鏋滅紪璇戝櫒鍙戠幇_stopped琚綣佸瓨鍙?_stopped鍦╳hile寰幆涓?錛岀紪璇戝櫒鍙兘浼?xì)鑰冭檻灝哶stopped緙撳瓨鍒板瘎瀛樺櫒涓紝浠ュ悗_stopped灝嗕細(xì)鐩存帴浠庡瘎瀛樺櫒瀛樺彇銆傝繖鏃跺欏鏋滄煇涓嚎紼嬭皟鐢ㄤ簡(jiǎn)thread.stop()錛屽_stopped鐨勪慨鏀瑰皢涓嶄細(xì)鍙嶆槧鍒板瘎瀛樺櫒涓紝thread灝嗕細(xì)姘歌繙寰幆涓嬪幓...

涓轟簡(jiǎn)闃叉緙栬瘧鍣ㄤ紭鍖栵紝鐢╲olatile鍏抽敭瀛楀氨O(jiān)K浜?jiǎn)锛寁olatile璺焎onst鐨勭敤娉曞嚑涔庝竴鏍鳳紝鑳界敤const鐨勫湴鏂逛篃閮借兘鐢╲olatile銆傚Singleton鏉ヨ錛屼慨鏀瑰涓嬩袱澶勫嵆鍙細(xì)
1聽(tīng)//singleton.h涓?/span>
2聽(tīng)static聽(tīng)Singleton聽(tīng)*_instance;
3聽(tīng)//鏀逛負(fù)

4聽(tīng)static聽(tīng)Singleton聽(tīng)*聽(tīng)volatile聽(tīng)_instance;
5聽(tīng)

6聽(tīng)//singleton.cpp涓?/span>
7聽(tīng)Singleton*聽(tīng)Singleton::_instance聽(tīng)=聽(tīng)0;
8聽(tīng)//鏀逛負(fù)

9聽(tīng)Singleton*聽(tīng)volatile聽(tīng)Singleton::_instance聽(tīng)=聽(tīng)0;


6.灝哠ingleton娉涘寲涓烘ā鏉?br />singleton.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)SINGLETON_H
聽(tīng)2聽(tīng)
#define聽(tīng)SINGLETON_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)#include聽(tīng)"synobj.h"
聽(tīng)5聽(tīng)
聽(tīng)6聽(tīng)template<class聽(tīng)T>
聽(tīng)7聽(tīng)class聽(tīng)Singleton聽(tīng){
聽(tīng)8聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(Singleton)
聽(tīng)9聽(tīng)public
:
10聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)T&聽(tīng)I(yíng)nstance()聽(tīng){聽(tīng)//聽(tīng)Unique聽(tīng)point聽(tīng)of聽(tīng)access

11聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==聽(tīng)_instance)聽(tīng){
12聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Lock聽(tīng)lock(_mutex);
13聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(0聽(tīng)==
聽(tīng)_instance)聽(tīng){
14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)new
聽(tīng)T();
15聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)atexit(Destroy);
16聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
17聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
18聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)*
_instance;
19聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
20聽(tīng)protected
:
21聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)Singleton(){}
22聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~
Singleton(){}
23聽(tīng)private
:
24聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)void聽(tīng)Destroy()聽(tīng){聽(tīng)//聽(tīng)Destroy聽(tīng)the聽(tīng)only聽(tīng)instance

25聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(聽(tīng)_instance聽(tīng)!=聽(tīng)0聽(tīng))聽(tīng){
26聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)delete聽(tīng)_instance;
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_instance聽(tīng)=聽(tīng)0
;
28聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
29聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
30聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static
聽(tīng)Mutex聽(tīng)_mutex;
31聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)T聽(tīng)*聽(tīng)volatile聽(tīng)_instance;聽(tīng)//聽(tīng)The聽(tīng)one聽(tīng)and聽(tīng)only聽(tīng)instance

32聽(tīng)};
33聽(tīng)

34聽(tīng)template<class聽(tīng)T>
35聽(tīng)Mutex聽(tīng)Singleton<T>::_mutex;
36聽(tīng)

37聽(tīng)template<class聽(tīng)T>
38聽(tīng)T聽(tīng)*聽(tīng)volatile聽(tīng)Singleton<T>::_instance聽(tīng)=聽(tīng)0;
39聽(tīng)

40聽(tīng)#endif/*SINGLETON_H*/

嫻嬭瘯浠g爜錛?br />test.cpp
聽(tīng)1聽(tīng)#include聽(tīng)"singleton.h"
聽(tīng)2聽(tīng)
聽(tīng)3聽(tīng)class聽(tīng)A聽(tīng):聽(tīng)public聽(tīng)Singleton<A>聽(tīng){
聽(tīng)4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)friend聽(tīng)class聽(tīng)Singleton<A>
;
聽(tīng)5聽(tīng)protected
:
聽(tīng)6聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)A(){}
聽(tīng)7聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~
A(){}
聽(tīng)8聽(tīng)public
:
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)DoSomething(){}
10聽(tīng)
};
11聽(tīng)

12聽(tīng)int聽(tīng)main()聽(tīng){
13聽(tīng)

14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)A聽(tīng)&a聽(tīng)=聽(tīng)A::Instance();
15聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)a.DoSomething();
16聽(tīng)

17聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)0;
18聽(tīng)}


7.Singleton鐨勬瀽鏋勯棶棰?/strong>
鍒版Singleton宸茬粡綆楁瘮杈冨畬鍠勪簡(jiǎn)錛屼絾鏄緷鐒剁畻涓嶄笂瀹岀編錛屽洜涓哄埌鐜板湪鍙槸瑙e喅浜?jiǎn)澶毦U跨▼闂錛屽姞鍏ヤ簡(jiǎn)妯℃澘鏀寔錛屽浜?span style="COLOR: #333399">KDL problem(The Dead Reference Problem)渚濈劧娌℃硶瑙e喅錛屽彲浠ヨ鍦ㄥ疄鐜癝ingleton妯″紡鏃訛紝鏈澶х殑闂灝辨槸澶氫釜鏈変緷璧栧叧緋葷殑Singleton鐨勬瀽鏋勯『搴?/span>銆傝櫧鐒?em style="COLOR: #333399">Modern C++ Design涓粰鍑轟簡(jiǎn)瑙e喅鏂規(guī)錛屼絾鏄?span style="COLOR: #333399">Loki鐨勫疄鐜板お榪囧鏉傦紝鍦ㄦ灝變笉璇︾粏璇存槑浜?jiǎn)锛屾湁鍏喘懀鐨勫彲浠ョ湅鐪?span style="COLOR: #333399">Modern C++ Design錛屽綋鐒朵簡(jiǎn)錛?span style="COLOR: #333399">Loki搴撲腑鐢ㄧ瓥鐣ユā寮忓疄鐜扮殑Singleton涔熷緢涓嶉敊錛?br />



]]>
闈炲畬緹嶤++ Singleton瀹炵幇[1]http://www.shnenglu.com/ant/archive/2007/09/07/31445.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 07 Sep 2007 06:49:00 GMThttp://www.shnenglu.com/ant/archive/2007/09/07/31445.htmlhttp://www.shnenglu.com/ant/comments/31445.htmlhttp://www.shnenglu.com/ant/archive/2007/09/07/31445.html#Feedback12http://www.shnenglu.com/ant/comments/commentRss/31445.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31445.htmlSingleton妯″紡鏄竴縐嶉潪甯哥畝鍗曠殑璁捐妯″紡錛岃繖縐嶆ā寮忓緢甯哥敤涔熷緢瀹規(guī)槗琚互鐢ㄣ傚綋浣犺璁″簲鐢ㄧ▼搴忕殑鏃跺欙紝緇忓父浼?xì)閬囧埌鏌愪簺瀵硅薄鍦ㄦ暣涓E嬪簭鐨勭敓鍛藉懆鏈熷簲璇ヤ粎鏈変竴涓疄渚嬬殑鎯呭喌錛屾瘮濡?span style="COLOR: #333399">File System錛孏raphic System錛孡ogging Utility錛岃繖鏃跺欏氨鍙互鐢ㄥ埌Singleton妯″紡銆係ingleton妯″紡鍦?span style="COLOR: #333399">GOF涓弿榪板涓嬶細(xì)

        Ensure a class only has one instance, and provide a global point of access to it.

Singleton妯″紡鐨勫畾涔夊緢綆鍗曪紝瀹炵幇涔熸湁N澶氱錛屼絾鏄嵈寰堥毦鎵懼埌涓涓О寰椾笂“瀹岀編”鐨勩傚疄鐜頒竴涓畬緹庣殑Singleton姣旀兂璞′腑瑕侀毦鐨勫錛屼笅闈㈡帰绱㈡х殑鏉ュ疄鐜頒竴涓潪瀹岀編鐨勩?br>
1.鍏稿瀷瀹炵幇
鍦–++涓紝Singleton妯″紡鐨勫吀鍨嬪疄鐜板涓嬶細(xì)

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance)
 6             _instance = new
 Singleton();
 7         return *
_instance;
 8 
    }
 9     void
 DoSomething();
10 private
:
11     Singleton(); // Prevent clients from creating a new Singleton

12     ~Singleton(); // Prevent clients from deleting a Singleton
13     Singleton(const Singleton&); // Prevent clients from copying a Singleton
14     Singleton& operator=(const Singleton& );
15 private
:
16     static Singleton *_instance; // The one and only instance

17  };
18 

19 // Implementation file Singleton.cpp
20 Singleton* Singleton::_instance = 0;


閫氳繃灝哠ingleton鐨勬瀯閫犲嚱鏁拌涓簆rivate鍙互紱佹瀹㈡埛浠g爜鐩存帴鍒涘緩Singleton瀵硅薄錛岄櫎姝や箣澶栵紝Singleton鐨刢opy constructor鍜宑opy assignment operator閮戒負(fù)private涓斾粎鏈夊0鏄庢病鏈夊疄鐜幫紝紱佹浜?jiǎn)瀹㈡埛浠g爜鎷疯礉Singleton瀵硅薄銆傚敮涓鍙互鍒涘緩Singleton瀵硅薄鐨勬槸Singleton鑷繁鐨勯潤(rùn)鎬佹垚鍛樺嚱鏁癐nstance錛岃繖鏍峰氨鍦ㄧ紪璇戝櫒淇濊瘉浜?jiǎn)Singleton瀹炰緥鐨勫敮涓鎬с備笂闈㈣繖浜涙槸鍦–++涓疄鐜癝ingleton妯″紡鏈鍩烘湰鐨勮鐐廣?br>
Instance鏂規(guī)硶淇濊瘉鍙湁鍦ㄧ涓嬈¤皟鐢ㄦ椂鎵嶄細(xì)鐢熸垚Singleton瀵硅薄錛屼互鍚庣殑璋冪敤鍙槸綆鍗曡繑鍥炲敮涓鐨勫凡瀛樺湪鐨勫疄渚嬨侷nstance鏂規(guī)硶瀹為檯涓婂疄鐜扮殑鏄?span style="COLOR: #333399">鎳掓儼鍒濆鍖?lazy initialize)錛?/em>濡傛灉紼嬪簭涓牴鏈病鏈夌敤鍒癝ingleton瀵硅薄錛屼篃灝辨牴鏈笉浼?xì)漶旂敓Singleton鐨勫疄渚嬶紝榪欏湪Singleton瀵硅薄寰堝皯浣跨敤涓斿垱寤篠ingleton瀵硅薄寮閿姣旇緝澶х殑鎯呭喌涓嬬壒鍒湁鐢ㄣ?/p>

瀹㈡埛浠g爜鐜板湪鍙互榪欐牱浣跨敤Singleton錛?/p>

1 Singleton &=  Singleton::Instance();
2 s.DoSomething();


榪橀渶瑕佽鏄庣殑鏄疭ingleton鐨勬瀽鏋勫嚱鏁幫紝鏋愭瀯鍑芥暟涔熶負(fù)private鍙互紱佹瀹㈡埛鍐欏嚭濡備笅浠g爜銆傚鏋滄煇涓鎴峰啓鍑轟簡(jiǎn)濡備笅浠g爜錛岄殢鍚庣殑瀵筍ingleton鐨勮闂氨浼?xì)瀵艰嚧湄?fù)瀹氫箟琛屼負(fù)錛屽洜涓篠ingleton瀵硅薄宸茬粡涓嶅瓨鍦ㄣ?br>

1 Singleton *= & Singleton::Instance();
2 delete p;


2.寮曞叆smart pointer
涓婇潰鐨勫疄鐜扮畻鏄竴涓ソ鐨勫疄鐜板悧錛熷綋鐒朵笉鏄紝鎴栬榪炰竴涓紜殑瀹炵幇閮界畻涓嶄笂銆傚鏋滀綘鎯沖噾鍚堬紝褰撶劧娌¢棶棰橈紝涓婇潰鐨勪唬鐮佸ぇ澶氭暟鎯呭喌涓嬪彲浠ュ伐浣滅殑寰堝ソ銆備篃璁鎬綘宸茬粡娉ㄦ剰鍒頒簡(jiǎn)涓浜涢棶棰橈紝姣斿璇村湪涓婇潰鐨勪唬鐮佷腑鍙湁new娌℃湁delete銆傛槸鐨勶紝浣犺浼?xì)鍙戠敓memory leak瀵瑰惂錛屽叾瀹瀖emory leak閮戒笉鏄富瑕佺殑闂錛屾墍鏈夌殑鐜頒唬鎿嶄綔緋葷粺鍦ㄨ繘紼嬬粨鏉熺殑鏃跺欓兘浼?xì)瀵瑰唴瀛樺緢濂界殑杩涜鍥炴敹銆傛瘮memory leak鏇村煎緱璁╀漢鎷呭咖鐨勬槸resource leak錛屽鏋淪ingleton鍦ㄦ瀯閫犲嚱鏁頒腑璇鋒眰浜?jiǎn)鏌愪簺璧勬簮锛?xì)緗戠粶榪炴帴錛屾枃浠跺彞鏌勶紝鏁版嵁搴撹繛鎺ョ瓑銆傝繖浜涜祫婧愬皢寰椾笉鍒伴噴鏀俱?br>
鍞竴淇resource leak鐨勬柟娉曞氨鏄湪紼嬪簭緇撴潫鐨勬椂鍊檇elete _instance銆傚綋鐒朵簡(jiǎn)錛岀敤smart pointer鍐嶅ソ涓嶈繃錛屽湪榪欓噷鐢╝uto_ptr灝卞彲浠ユ弧瓚抽渶瑕佷簡(jiǎn)(濡傛灉浣犺繕?shù)笉鐭ラ亾smart_ptr鏄粈涔堬紝鑺辯偣鏃墮棿鐔熸?zhèn)塁++鏍囧噯搴撳惂)錛屼慨鏀瑰悗鐨勪唬鐮佸涓嬶細(xì)

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance.get())
 6             _instance.reset(new
 Singleton());
 7         return *
(_instance.get());
 8 
    }
 9     void
 DoSomething(){}
10 private
:
11     Singleton(){} // Prevent clients from creating a new Singleton

12     ~Singleton(){} // Prevent clients from deleting a Singleton
13     Singleton(const Singleton&); // Prevent clients from copying a Singleton
14     Singleton& operator=(const Singleton& );
15 private
:
16     friend auto_ptr<Singleton>
;
17     static auto_ptr<Singleton> _instance; // The one and only instance

18  };
19 

20 // Implementation file Singleton.cpp
21 auto_ptr<Singleton> Singleton::_instance;


3.鐢╝texit鏇挎崲smart pointer
C++騫舵病鏈夎瀹氫笉鍚?span style="COLOR: #333399">緙栬瘧鍗曞厓(translation unit錛岀畝鍗曡灝辨槸涓涓彲緙栬瘧鐨刢pp鏂囦歡)涓璼tatic瀵硅薄鐨勫垵濮嬪寲欏哄簭銆傚鏋滀竴涓▼搴忎腑鏈夊涓猄ingleton瀵硅薄錛岄偅涔堣繖浜汼ingleton瀵硅薄鐨勬瀽鏋勯『搴忎篃灝嗘槸浠繪剰鐨勩傚緢鏄劇劧錛屽綋澶氫釜Singleton瀵硅薄鏈変緷璧栧叧緋繪椂錛宻mart pointer鏍規(guī)湰鏃犳硶淇濊瘉Singleton鐨勬瀽鏋勯『搴忋?br>
msdn涓atexit鎻忚堪濡備笅錛?/p>

The atexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to atexit create a register of functions that are executed in last-in, first-out (LIFO) order. The functions passed to atexit cannot take parameters. atexit  use the heap to hold the register of functions. Thus, the number of functions that can be registered is limited only by heap memory.

闇瑕佽鏄庣殑鏄痑texit騫朵笉姣攕mart pointer濂藉灝戯紝LIFO鐨勪繚璇佸浜庢湁澶嶆潅渚濊禆鍏崇郴鐨勫涓猄ingleton渚濈劧鏉熸墜鏃犲姏錛屼絾鏄敤atexit鏇挎崲smart pointer鍗存槸蹇呴』鐨勶紝瀹冩槸璁捐瀹岀編Singleton鐨勫熀紜銆?br>

#濡傛灉浣犵枒鎯慳texit涓轟粈涔堣繕鏄笉琛岋紝璇瘋(gè)冭檻涓嬮潰鐨勬儏鍐碉細(xì)
NOTE錛氫笅闈㈢殑鎯呭喌鍦?em>Modern C++ Design
涓彨鍋?em style="COLOR: #333399">KDL(Keyboard,Display,Log)problem銆?br>
鏌愪釜紼嬪簭涓嬌鐢ㄤ簡(jiǎn)濡備笅3涓猄ingleton錛?span style="COLOR: #333399">Keyboard錛?span style="COLOR: #333399">Display錛?span style="COLOR: #333399">Log銆?span style="COLOR: #333399">Keyboard鍜?span style="COLOR: #333399">Display鍒嗗埆瀵瑰簲浜庤綆楁満鐨勯敭鐩樺拰鏄劇ず鍣紝Log鐢ㄦ潵璁板綍閿欒淇℃伅銆傚亣璁懼綋Keyboard鍜?span style="COLOR: #333399">Display鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍑虹幇閿欒鏃朵細(xì)璋冪敤Log璁板綍閿欒淇℃伅錛屽茍涓旀瀯閫犲拰鏋愭瀯瀵艱嚧鐨勪換浣曢敊璇兘浼?xì)缁堟绋嬪簭銆?br>
鍦ㄧ▼搴忓惎鍔ㄦ椂錛屽鏋?span style="COLOR: #333399">Keyboard鏋勯犳垚鍔燂紝Display鏋勯犲け璐ワ紝寰堟樉鐒跺湪Display鐨勬瀯閫犲嚱鏁頒腑灝嗕細(xì)鏋勯?span style="COLOR: #333399">Log鑰屼笖澶辮觸淇℃伅浼?xì)琚?span style="COLOR: #333399">Log璁板綍錛屾牴鎹亣璁捐繖鏃跺欑▼搴忓噯澶囬鍑猴紝atexit娉ㄥ唽鐨勫嚱鏁板皢浼?xì)鎸塋IFO鐨勯『搴忚璋冪敤銆傚洜涓?span style="COLOR: #333399">Keyboard鍏堜簬Log鏋勯狅紝鎵浠?span style="COLOR: #333399">Log鍏堜簬Keyboard鏋愭瀯錛屼絾鏄綋鐢變簬鏌愮鍘熷洜Keyboard鍦ㄦ瀽鏋勬椂澶辮觸錛屾兂瑕佽皟鐢?span style="COLOR: #333399">Log璁板綍閿欒淇℃伅鏃訛紝Log鏃╁凡琚攢姣侊紝鍒橪og::Instance()灝嗕細(xì)瀵艱嚧鏈畾涔夎涓恒?br>

#atexit鐨勪弗閲嶉棶棰橈細(xì)
浠庝笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭錛宎texit鍜宻mart pointer鐩告瘮浠呬粎鏄湁LIFO鐨勪繚璇佽屽凡錛岃繖鏍風(fēng)殑淇濊瘉璨屼技涔熶笉鎬庝箞鏈夋晥錛屽洜涓篴texit璺焥mart pointer涓鏍蜂篃鏃犳硶瑙e喅KDL probleam銆?br>
atexit鐢變簬LIFO甯︽潵浜?jiǎn)鍙﹀鐨勯棶棰樺Q岀湅涓嬮潰鐨勪唬鐮侊細(xì)

 1 #include <cstdlib>
 2 void  Bar() {
 3 
    ...
 4 
}
 5 void
 Foo() {
 6 
    std::atexit(Bar);
 7 
}
 8 int
 main() {
 9 
    std::atexit(Foo);
10     return 0
;
11 }

涓婇潰鐨勫皬孌典唬鐮佺敤atexit娉ㄥ唽浜?jiǎn)Foo錛孎oo璋冪敤浜?jiǎn)std::atexit(Bar)銆傚綋紼嬪簭閫鍑烘椂錛屾牴鎹產(chǎn)texit鐨凩IFO淇濊瘉錛孊ar鍦‵oo涔嬪悗娉ㄥ唽錛屽洜姝ar搴旇鍦‵oo涔嬪墠璋冪敤錛屼絾鏄綋Bar娉ㄥ唽鐨勬椂鍊橣oo宸茬粡璋冪敤浜?jiǎn)锛孊ar鏍規(guī)湰灝辨病鏈夋満浼?xì)鑳藉鍦‵oo涔嬪墠璋冪敤銆傝繖鏄庢樉鑷浉鐭涚浘瀵瑰惂錛屾病鍔炴硶錛孋++鏍囧噯濂藉儚蹇借浜?jiǎn)杩欎竴鐐癸紝鍥犳濡傛灉綾諱技浠g爜琚皟鐢紝鑲畾涓嶄細(xì)鏈変粈涔堝ソ鐨勭粨鏋滐紝濂戒竴鐐規(guī)槸resource leak錛屽樊涓鐐逛及璁$▼搴忓氨宕╂簝浜?jiǎn)锛佸Q侊紒

atexit鐨勮繖涓棶棰樿窡Singleton鏈夊叧緋誨悧錛熷綋鐒舵湁錛屽鏋滃湪涓涓猄ingleton鐨勬瀽鏋勫嚱鏁頒腑璋冪敤atexit灝變細(xì)鍑虹幇涓婅堪闂銆傚嵆鍦?span style="COLOR: #333399">KDL problem涓紝濡傛灉Keyboard鍜?span style="COLOR: #333399">Display閮芥瀯閫犳垚鍔燂紝褰?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display浠繪剰涓涓瀽鏋勫け璐ユ椂錛?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display鍦ㄦ瀽鏋勫嚱鏁頒腑浼?xì)鏋勯?span style="COLOR: #333399">Log錛?span style="COLOR: #333399">Log鐨勬瀯閫犲嚱鏁頒細(xì)闂存帴璋冪敤atexit銆俹ops!!!錛屽彲鎬曠殑鏈畾涔夎涓恒?br>
鐪嬪埌榪欓噷浣犱竴瀹氬atexit鐩稿綋澶辨湜錛岃矊浼煎畠甯︽潵鐨勫ソ澶勫浜庡潖澶勩備絾鏄浣犵浉淇★紝濡傛灉閫傚綋璁捐錛宎texit鍦ㄥ悗闈㈢殑Singleton鏀歸犱腑浼?xì)钃v鍒板緢閲嶈鐨勪綔鐢ㄣ?br>
鐢╝texit鍚庣殑浠g爜錛?/p>

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance) {
 6             _instance = new
 Singleton();
 7             atexit(Destroy); // Register Destroy function

 8          }
 9         return *
_instance;
10 
    }
11     void
 DoSomething(){}
12 private
:
13     static void Destroy() { // Destroy the only instance

14         if ( _instance != 0  ) {
15 
            delete _instance;
16             _instance = 0
;
17 
        }
18 
    }
19     Singleton(){} // Prevent clients from creating a new Singleton

20     ~Singleton(){} // Prevent clients from deleting a Singleton
21     Singleton(const Singleton&); // Prevent clients from copying a Singleton
22     Singleton& operator=(const Singleton& );
23 private
:
24     static Singleton *_instance; // The one and only instance

25  };
26 

27 // Implementation file Singleton.cpp
28 Singleton* Singleton::_instance = 0;

浣犳湁娌℃湁浠旂粏鑰冭檻榪嘍estroy涓殑_instance = 0;榪欎竴琛屼唬鐮侊紝涓婅堪浠g爜瀹為檯涓婂疄鐜扮殑鏄?em style="COLOR: #333399">涓嶆楦熸ā寮?The Phoenix Singleton)錛?/em>鎵璋撲笉姝婚笩錛屽氨璺熶竴杈変竴鏍峰彲浠ユ鑰屽鐢熴備笂闈㈢殑浠g爜鍙互瑙e喅鏈枃鏈鏃╂彁鍑虹殑KDL problem錛屽嵆濡傛灉Keyboard鏋愭瀯澶辮觸錛岃櫧鐒?span style="COLOR: #333399">Log宸茬粡鏋愭瀯錛屼絾鏄敱浜嶥estroy涓殑_instance = 0;榪欎竴琛屼唬鐮侊紝Log::Instance()灝嗕細(xì)鍒涘緩涓涓柊鐨?span style="COLOR: #333399">Log瀵硅薄錛岀▼搴忓皢浼?xì)琛ㄧ幇鑹ソ銆傚綋鐒朵簡(jiǎn)錛?span style="COLOR: #993366">Phoenix Singleton浠呰兘鐢ㄤ簬鏃犵姸鎬佺殑Singleton錛屽鏋?span style="COLOR: #333399">Log闇瑕佷繚瀛樻煇浜涚姸鎬侊紝Phoenix Singleton涔熶笉浼?xì)甯︽潵鋼Q浣曞ソ澶勩備綘褰撶劧鍙互鐢ㄦ煇浜涙柟娉曠淮鎸?span style="COLOR: #993366">Phoenix Singleton鐨勭姸鎬侊紝浣嗘槸鍦ㄥ仛涔嬪墠鍏堟兂鎯崇湅鏄惁鍊煎緱錛岀淮鎸佺姸鎬佸彲鑳戒細(xì)浣縎ingleton鍙樺緱鐗瑰埆澶嶆潅銆?br>
涓婇潰鐨?span style="COLOR: #993366">Phoenix Singleton宸茬粡鍙互婊¤凍澶ч儴鍒嗛渶瑕侊紝濡傛灉浣犵殑Singleton娌℃湁娑夊強(qiáng)鍒板綰跨▼錛屽涓猄ingleton涔嬮棿涔熸病鏈変緷璧栧叧緋伙紝浣犲ぇ鍙互鏀懼績(jī)浣跨敤銆備絾鏄鏋滀綘鐢ㄥ埌澶氱嚎紼嬶紝鎴栬呬綘鐨凷ingleton鍏崇郴濡?span style="COLOR: #333399">KDL鑸鏉傦紝鎴栬呬綘瑙夊緱瀵規(guī)瘡涓涓猄ingleton閮芥暡鍚屾牱鐨勪唬鐮佽浣犲帉鐑?chǔ)銆傚湪鍚庨潰鍑犵瘒浼?xì)鏈変竴涓?span style="COLOR: #993366">澶氱嚎紼嬪畨鍏?/span>鐨勶紝鑳藉瑙e喅澶氫釜Singleton渚濊禆鍏崇郴鐨勶紝鍩轟簬妯℃澘鐨凷ingleton瀹炵幇銆?br>

]]>
浠嶹in32 API灝佽Thread綾籟2]http://www.shnenglu.com/ant/archive/2007/08/31/31280.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 31 Aug 2007 03:58:00 GMThttp://www.shnenglu.com/ant/archive/2007/08/31/31280.htmlhttp://www.shnenglu.com/ant/comments/31280.htmlhttp://www.shnenglu.com/ant/archive/2007/08/31/31280.html#Feedback7http://www.shnenglu.com/ant/comments/commentRss/31280.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31280.html(functor聽(tīng)and function object)浣滀負(fù)鏋勯犲嚱鏁板弬鏁般傚鏋滀綘鐔熸?zhèn)塖TL錛屼綘搴旇鐔熸?zhèn)塨ind1st鍜宐ind2nd榪欎袱涓嚱鏁伴厤鎺ュ櫒(function adapter)錛宐ind1st鍜宐ind2nd鍙互灝嗕竴涓簩鍏冨嚱鏁?binary function)杞崲鎴愪竴鍏冨嚱鏁?unary function)銆備負(fù)浜?jiǎn)鋴蒚hread綾昏兘澶熺敤鏅氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負(fù)鍙傛暟錛屾垜浠渶瑕佷竴涓猙ind灝嗕竴鍏冨嚱鏁拌漿鎹㈡垚鏃犲弬鍑芥暟錛?br />bind.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)BIND_H
聽(tīng)2聽(tīng)
#define聽(tīng)BIND_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)template聽(tīng)<class聽(tīng)_Result>
聽(tīng)5聽(tīng)struct聽(tīng)trivial_function聽(tīng){
聽(tīng)6聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)typedef聽(tīng)_Result聽(tīng)result_type;
聽(tīng)7聽(tīng)
};
聽(tīng)8聽(tīng)

聽(tīng)9聽(tīng)template聽(tīng)<class聽(tīng)_Operation>
10聽(tīng)class聽(tīng)binder聽(tīng):聽(tīng)public聽(tīng)trivial_function<typename聽(tīng)_Operation::result_type>聽(tīng){
11聽(tīng)public
:
12聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)binder(const聽(tīng)_Operation& x,聽(tīng)const聽(tīng)typename聽(tīng)_Operation::argument_type&
y)
13聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng):op(x),聽(tīng)value(y)聽(tīng){}
14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)typename聽(tīng)_Operation::result_type聽(tīng)operator()()聽(tīng)const
聽(tīng){
15聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return
聽(tīng)op(value);
16聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
17聽(tīng)protected
:
18聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)_Operation聽(tīng)op;
19聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)typename聽(tīng)_Operation::argument_type聽(tīng)value;
20聽(tīng)
};
21聽(tīng)

22聽(tīng)template聽(tīng)<class聽(tīng)_Operation,聽(tīng)class聽(tīng)_Tp>
23聽(tīng)inline聽(tīng)binder<_Operation>聽(tīng)
24聽(tīng)bind(const聽(tīng)_Operation&聽(tīng)__fn,聽(tīng)const聽(tīng)_Tp&
聽(tīng)__x)聽(tīng)
25聽(tīng)
{
26聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)typedef聽(tīng)typename聽(tīng)_Operation::argument_type聽(tīng)_Arg_type;
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)binder<_Operation>
(__fn,聽(tīng)_Arg_type(__x));
28聽(tīng)
}
29聽(tīng)

30聽(tīng)#endif/*BIND_H*/

鏈変簡(jiǎn)bind鎴戜滑榪橀渶瑕佷慨鏀筎hread綾葷殑鏋勯犲嚱鏁幫紝鏄劇劧鎴戜滑蹇呴』灝嗘瀯閫犲嚱鏁板0鏄庝負(fù)鎴愬憳妯℃澘(榪樻湁涓縐嶆柟娉曚篃鍙互杈懼埌鍚屾牱鐨勭洰鐨勶紝灝辨槸鎶奣hread綾誨0鏄庝負(fù)妯℃澘錛屼絾鏄繖鏍風(fēng)殑璁捐濂藉儚涓嶅お濂?錛岃繖鏍鋒墠鑳藉璁㏕hread綾葷殑鏋勯犲嚱鏁板彲浠ユ帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼慨鏀瑰悗鐨勬瀯閫犲嚱鏁板簲璇ヨ兘澶熶嬌鐢ㄥ涓嬩笁縐嶇被鍨嬬殑鍙傛暟錛?br />1.Runnable *
2.no argument function
3.no argument functor
涓嬮潰鏄慨鏀瑰悗鐨勫ご鏂囦歡錛?br />runnable.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)RUNNABLE_H
聽(tīng)2聽(tīng)
#define聽(tīng)RUNNABLE_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)struct聽(tīng)Runnable聽(tīng){
聽(tīng)5聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void聽(tīng)run()聽(tīng)=聽(tīng)0
;
聽(tīng)6聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)~
Runnable()聽(tīng){}
聽(tīng)7聽(tīng)
};
聽(tīng)8聽(tīng)

聽(tīng)9聽(tīng)template聽(tīng)<class聽(tīng)T>
10聽(tīng)class聽(tīng)RunnableFunctor聽(tīng):聽(tīng)public聽(tīng)Runnable聽(tīng){
11聽(tīng)public
:
12聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)RunnableFunctor(const聽(tīng)T&
f)聽(tīng):_func(f)聽(tīng){}
13聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){聽(tīng)_func();聽(tīng)}
14聽(tīng)private
:
15聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)T聽(tīng)_func;
16聽(tīng)
};
17聽(tīng)

18聽(tīng)//base聽(tīng)template聽(tīng)for聽(tīng)no聽(tīng)argument聽(tīng)functor
19聽(tīng)template聽(tīng)<class聽(tīng)T>
20聽(tīng)struct聽(tīng)FuncImpl聽(tīng){
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)Runnable*聽(tīng)transfer(const聽(tīng)T&
t)聽(tīng){
22聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)new聽(tīng)RunnableFunctor<T>
(t);
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
24聽(tīng)
};
25聽(tīng)

26聽(tīng)//partial聽(tīng)specialization聽(tīng)for聽(tīng)T*
27聽(tīng)template聽(tīng)<class聽(tīng)T>
28聽(tīng)struct聽(tīng)FuncImpl<T*>聽(tīng){
29聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)Runnable*聽(tīng)transfer(T*
t)聽(tīng){
30聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return
聽(tīng)t;
31聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
32聽(tīng)
};
33聽(tīng)

34聽(tīng)//partial聽(tīng)specialization聽(tīng)for聽(tīng)no聽(tīng)argument聽(tīng)function
35聽(tīng)template聽(tīng)<class聽(tīng)T>
36聽(tīng)struct聽(tīng)FuncImpl<T聽(tīng)(*)()>聽(tīng){
37聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)Runnable*聽(tīng)transfer(T聽(tīng)(*
t)())聽(tīng){
38聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)new聽(tīng)RunnableFunctor<T聽(tīng)(*)()>
(t);
39聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
40聽(tīng)
};
41聽(tīng)

42聽(tīng)template聽(tīng)<class聽(tīng)T>
43聽(tīng)inline聽(tīng)Runnable*聽(tīng)transfer(const聽(tīng)T& t)聽(tīng){
44聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)FuncImpl<T>
::transfer(t);
45聽(tīng)
}
46聽(tīng)

47聽(tīng)#endif/*RUNNABLE_H*/

thread.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)THREAD_H
聽(tīng)2聽(tīng)
#define聽(tīng)THREAD_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)#include聽(tīng)<windows.h>
聽(tīng)5聽(tīng)#include聽(tīng)"bind.h"
聽(tīng)6聽(tīng)#include聽(tīng)"runnable.h"
聽(tīng)7聽(tīng)
聽(tīng)8聽(tīng)#define聽(tīng)CLASS_UNCOPYABLE(classname)聽(tīng)\
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)private
:聽(tīng)\
10聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname(const聽(tīng)classname&
);聽(tīng)\
11聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname&聽(tīng)operator=(const聽(tīng)classname&
);
12聽(tīng)

13聽(tīng)class聽(tīng)Thread聽(tīng):聽(tīng)public聽(tīng)Runnable聽(tīng){
14聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(Thread)
15聽(tīng)public
:
16聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread()
17聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng):_target(0
)
18聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng),_handle(0
)聽(tīng){
19聽(tīng)

20聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)template聽(tīng)<class聽(tīng)T>

22聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)explicit聽(tīng)Thread(const聽(tīng)T& op)
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng):_target(transfer(op))
24聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng),_handle(0
)聽(tīng){
25聽(tīng)

26聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)~
Thread();
28聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){}
29聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)start();
30聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)join();
31聽(tīng)private
:
32聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)unsigned聽(tīng)__stdcall聽(tīng)threadProc(void*
param);
33聽(tīng)private
:
34聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Runnable*
_target;
35聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)HANDLE聽(tīng)_handle;
36聽(tīng)
};
37聽(tīng)

38聽(tīng)#endif/*THREAD_H*/

thread.cpp鍜屽墠涓綃囩殑鍑犱箮涓鏍鳳紝鍞竴鐨勪笉鍚屾槸鍘繪帀浜?jiǎn)鏋勯犲嚱鏁癟hread(Runnable *)錛屽洜涓虹幇鍦ㄧ殑鏋勯犲嚱鏁版敼鎴愪簡(jiǎn)鎴愬憳妯℃澘錛屽疄鐜頒篃鏀懼湪thread.h涓簡(jiǎn)銆傜幇鍦ㄧ殑鏋勯犲嚱鏁拌兘澶熸帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼富瑕佸綊鍔熶簬妯℃澘鍑芥暟transfer錛屽疄鐜頒唬鐮佸湪runnable.h涓紝涓昏鎶宸ф槸鐢ㄧ被鐨勫亸鐗瑰寲妯℃嫙鍑芥暟妯℃澘鐨勫亸鐗瑰寲錛屼笉鏄庣櫧鐨勮鐪?a id="_117bf2a46b69_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl" href="/ant/archive/2007/08/30/31201.html">涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/a>銆?br />
涓嬮潰鏄祴璇曚唬鐮侊細(xì)
test.cpp
聽(tīng)1聽(tīng)#include聽(tīng)"thread.h"
聽(tīng)2聽(tīng)#include聽(tīng)<iostream>
聽(tīng)3聽(tīng)#include聽(tīng)<functional>
聽(tīng)4聽(tīng)
聽(tīng)5聽(tīng)using聽(tīng)namespace聽(tīng)std;
聽(tīng)6聽(tīng)

聽(tīng)7聽(tīng)//no聽(tīng)argument聽(tīng)function
聽(tīng)8聽(tīng)void聽(tīng)print()聽(tīng){
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"print"聽(tīng)<<
聽(tīng)endl;
10聽(tīng)
}
11聽(tīng)

12聽(tīng)//unary聽(tīng)function
13聽(tīng)void聽(tīng)print1(int聽(tīng)n)聽(tīng){
14聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"print1"聽(tīng)<<
聽(tīng)endl;
15聽(tīng)
}
16聽(tīng)

17聽(tīng)//binary聽(tīng)function
18聽(tīng)void聽(tīng)print2(int聽(tīng)m,聽(tīng)int聽(tīng)n)聽(tīng){
19聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"print2"聽(tīng)<<
聽(tīng)endl;
20聽(tīng)
}
21聽(tīng)

22聽(tīng)
23聽(tīng)//no聽(tīng)argument聽(tīng)functor
24聽(tīng)struct聽(tīng)PrintFunctor聽(tīng){
25聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void聽(tīng)operator()()聽(tīng)const
聽(tīng){
26聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"PrintFunctor"聽(tīng)<<
聽(tīng)endl;
27聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
28聽(tīng)
};
29聽(tīng)

30聽(tīng)//unary聽(tīng)functor
31聽(tīng)struct聽(tīng)PrintFunctor1聽(tīng):聽(tīng)public聽(tīng)unary_function<int,聽(tīng)void>聽(tīng){
32聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void聽(tīng)operator()(int聽(tīng)n)聽(tīng)const
聽(tīng){
33聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"PrintFunctor1"聽(tīng)<<
聽(tīng)endl;
34聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
35聽(tīng)
};
36聽(tīng)

37聽(tīng)//binary聽(tīng)functor
38聽(tīng)struct聽(tīng)PrintFunctor2聽(tīng):聽(tīng)public聽(tīng)binary_function<int,聽(tīng)int,聽(tīng)void>聽(tīng){
39聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void聽(tīng)operator()(int聽(tīng)m,聽(tīng)int聽(tīng)n)聽(tīng)const
聽(tīng){
40聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"PrintFunctor2"聽(tīng)<<
聽(tīng)endl;
41聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
42聽(tīng)
};
43聽(tīng)

44聽(tīng)int聽(tīng)main()聽(tīng){
45聽(tīng)

46聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)no聽(tīng)argument聽(tīng)function
47聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread1(&print);
48聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread1.start();
49聽(tīng)

50聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)unary聽(tīng)function
51聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread2(bind(ptr_fun(print1),聽(tīng)5));
52聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread2.start();
53聽(tīng)

54聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)binary聽(tīng)function
55聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread3(bind(bind1st(ptr_fun(print2),聽(tīng)1),聽(tīng)2));
56聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread3.start();
57聽(tīng)

58聽(tīng)
59聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)no聽(tīng)argument聽(tīng)functor
60聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread4((PrintFunctor()));
61聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread4.start();
62聽(tīng)

63聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)unary聽(tīng)functor
64聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread5(bind(PrintFunctor1(),聽(tīng)5));
65聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread5.start();
66聽(tīng)

67聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//construct聽(tīng)Thread聽(tīng)with聽(tīng)binary聽(tīng)functor
68聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread6(bind(bind1st(PrintFunctor2(),聽(tīng)1),聽(tīng)2));
69聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread6.start();
70聽(tīng)

71聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread1.join();
72聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread2.join();
73聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread3.join();
74聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread4.join();
75聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread5.join();
76聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread6.join();
77聽(tīng)

78聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)0;
79聽(tīng)}

褰撶劧浜?jiǎn)锛屼笂闈㈢殑迤堜笉鏄叏閮ㄥQ屼慨鏀瑰悗鐨凾hread綾諱笉浠呰兘澶熶嬌鐢ㄥ師鍏堢殑浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛鐨勬柟娉曪紝榪樺彲浠ヤ嬌鐢ㄤ換浣曟棤鍙傚嚱鏁版垨鏃犲弬鍑芥暟瀵硅薄銆傞櫎浜?jiǎn)test.cpp閲岀ず鑼冪殑錛屼綘鐢氳嚦鍙互鐢╞ind,bind1st,bind2st,mem_fun,mem_fun_ref鐨勭粍鍚堟潵鐢ㄦ煇涓被鐨勬垚鍛樺嚱鏁頒綔涓哄弬鏁幫紝鍏鋒湁瓚呭己鐨勭伒媧繪с?br />
鐩墠瀹炵幇鐨勮繖浜涢兘鏄疶hread綾繪渶鍩烘湰鐨勫姛鑳斤紝鍏朵粬鍔熻兘濡傝緗嚎紼嬩紭鍏堢駭錛屾寕璧鋒垨鎭㈠綰跨▼錛屽紓甯稿鐞嗙瓑鍏蜂綋瀹炵幇閮芥瘮杈冪畝鍗曪紝榪欒繖閲屽氨涓嶄竴涓瀹炵幇浜?jiǎn)銆?
婧愪唬鐮佷笅杞斤細(xì)鐐瑰嚮涓嬭澆


]]>
C++&Win32鍐欑殑絀哄綋鎺ラ緳http://www.shnenglu.com/ant/archive/2007/08/30/31234.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 13:37:00 GMThttp://www.shnenglu.com/ant/archive/2007/08/30/31234.htmlhttp://www.shnenglu.com/ant/comments/31234.htmlhttp://www.shnenglu.com/ant/archive/2007/08/30/31234.html#Feedback19http://www.shnenglu.com/ant/comments/commentRss/31234.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31234.html絀哄綋鎺ラ緳娓告垙錛屽啓浜?jiǎn)涓涓ぜ鎷滐紝瀹屽叏浠縲indows鐨勫懙鍛點(diǎn)?br>涓嶈繃涔熶笉鍏ㄤ竴鏍鳳紝鏈変竴浜涚粏鑺備竴鐩存病鏈夋椂闂村紕錛屾病鍔炴硶鏈榪戞瘮杈冩噿...

涓巜indows涓嬬殑鐩告瘮錛屾垜鍋氱殑榪欎釜鍔犲叆浜?span style="COLOR: #993300">AI(蹇嵎閿瓼6)錛屽彲浠ュ紑鍚?span style="COLOR: #993300">縐葷墝鎻愮ず(蹇嵎閿瓼7)錛屼笉榪?span style="COLOR: #993300">鎾ら攢涓鐩存病鏈夊仛錛屽彲鑳藉摢澶╃獊鐒舵兂鍋氫簡(jiǎn)浼?xì)鍔犱笂鍘汇傚彟澶栨敼榪涗簡(jiǎn)搴熺墝鍥炴敹綆楁硶錛岄潪娉曠Щ鐗岀殑鎻愮ず鐩存帴鍘繪帀浜?jiǎn)锛寴q樻湁涓浜涘皬鐨勭粏鑺備綔浜?jiǎn)鏀箻q涖?br>鎰熷叴瓚g殑鍙互涓嬭澆錛?a title=鐐瑰嚮涓嬭澆 href="http://www.shnenglu.com/Files/ant/Freecell.rar">鐐瑰嚮涓嬭澆
婧愪唬鐮佷笅杞斤細(xì)鐐瑰嚮涓嬭澆
欏轟究鍙戝嚑寮犳埅鍥撅細(xì)







]]>
涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/title><link>http://www.shnenglu.com/ant/archive/2007/08/30/31201.html</link><dc:creator>铓傝殎緇堢粨鑰?/dc:creator><author>铓傝殎緇堢粨鑰?/author><pubDate>Thu, 30 Aug 2007 05:55:00 GMT</pubDate><guid>http://www.shnenglu.com/ant/archive/2007/08/30/31201.html</guid><wfw:comment>http://www.shnenglu.com/ant/comments/31201.html</wfw:comment><comments>http://www.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/ant/comments/commentRss/31201.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ant/services/trackbacks/31201.html</trackback:ping><description><![CDATA[ <p> <font face="Verdana" color="#006666">Overloading vs. Specialization</font> <br /> <br />鍦–++涓湁<em>class templates</em> 鍜?em>function templates</em>錛岃繖涓ょ妯$増鏈夊緢澶氬尯鍒紝鏈閲嶈鐨勫尯鍒氨鏄噸杞?overloading)錛?br />鏅氱殑C++綾諱笉鑳介噸杞斤紝褰撶劧綾繪ā鐗堜篃涓嶈兘閲嶈澆錛涚浉鍙嶏紝鏅氬嚱鏁板彲浠ラ噸杞斤紝鍑芥暟妯$増涔熻兘閲嶈澆銆傝繖鍐嶆甯鎬笉榪囷紝鐪嬩笅闈㈢殑浠g爜錛?/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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)Example聽(tīng)1:聽(tīng)Class聽(tīng)vs.聽(tīng)function聽(tīng)template,聽(tīng)and聽(tīng)overloading聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)</font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)A聽(tīng)class聽(tīng)template</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)X聽(tīng){聽(tīng)</span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">聽(tīng)};聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(a)<br /></span> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)</font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)A聽(tīng)function聽(tīng)template聽(tīng)with聽(tīng)two聽(tīng)overloads</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)T聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(b)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,聽(tīng)T,聽(tīng)</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">聽(tīng));聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(c)<br /></span> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #008000"></span></font> </div> <p>鍍忎笂闈㈡湭鐗瑰寲鐨勬ā鏉塊氬父鍙仛<em>base templates</em>銆傚綋鐒?dòng)灱?em>base templates</em>鑳藉琚壒鍖栵紝鍦ㄧ壒鍖栬繖涓鐐逛笂<br /><em>class templates</em> 鍜?em>function templates</em>鏈夊緢澶х殑鍖哄埆錛氫竴涓?em>class template</em> 鑳藉琚?em>partially specialized</em> and/or <br /><em>fully specialized</em>錛屼竴涓?em>function template</em>鍙兘琚?em>fully specialized</em>錛屼絾鏄敱浜?em>function template</em>s鑳藉閲嶈澆鎴戜滑鍙互閫氳繃閲嶈澆鏉ュ疄鐜板拰<em>partially specialized</em> 鐩稿綋鐨勫姛鑳姐備笅闈㈢殑浠g爜璇存槑浜?jiǎn)杩欎簺鍖哄埆锛?xì)</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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)Example聽(tīng)1,聽(tīng)continued:聽(tīng)Specializing聽(tīng)templates聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)</font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)A聽(tīng)partial聽(tīng)specialization聽(tīng)of聽(tīng)(a)聽(tīng)for聽(tīng)pointer聽(tīng)types聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)X</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">*></span><span style="COLOR: #000000">聽(tīng){聽(tīng)</span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)};<br /></span> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)A聽(tīng)full聽(tīng)specialization聽(tīng)of聽(tīng)(a)聽(tīng)for聽(tīng)int聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)X</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng){聽(tīng)</span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)};<br /></span> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)A聽(tīng)separate聽(tīng)base聽(tīng)template聽(tīng)that聽(tīng)overloads聽(tīng)(b)聽(tīng)and聽(tīng)(c)聽(tīng)<br /></span> <span style="COLOR: #008080">11</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)--聽(tīng)NOT聽(tīng)a聽(tīng)partial聽(tīng)specialization聽(tīng)of聽(tīng)(b),聽(tīng)because聽(tīng)<br /></span> <span style="COLOR: #008080">12</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)there's聽(tīng)no聽(tīng)such聽(tīng)thing聽(tīng)as聽(tīng)a聽(tīng)partial聽(tīng)specialization聽(tīng)<br /></span> <span style="COLOR: #008080">13</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)of聽(tīng)a聽(tīng)function聽(tīng)template!聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(d)<br /></span> <span style="COLOR: #008080">15</span>聽(tīng)</font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">16</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)A聽(tīng)full聽(tīng)specialization聽(tīng)of聽(tīng)(b)聽(tīng)for聽(tīng)int聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">17</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">(聽(tīng)</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(e)<br /></span> <span style="COLOR: #008080">18</span>聽(tīng)</font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">19</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)A聽(tīng)plain聽(tīng)old聽(tīng)function聽(tīng)that聽(tīng)happens聽(tīng)to聽(tīng)overload聽(tīng)with聽(tīng)<br /></span> <span style="COLOR: #008080">20</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(b),聽(tīng)(c),聽(tīng)and聽(tīng)(d)聽(tīng)--聽(tīng)but聽(tīng)not聽(tīng)(e),聽(tīng)which聽(tīng)we'll聽(tīng)<br /></span> <span style="COLOR: #008080">21</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)discuss聽(tīng)in聽(tīng)a聽(tīng)moment聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">22</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)(f)<br /></span> <span style="COLOR: #008080">23</span>聽(tīng)<span style="COLOR: #008000"></span></font> </div> <p>鏍規(guī)嵁鍑芥暟閲嶈澆瑙f瀽瑙勫垯錛?/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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)Example聽(tīng)1,聽(tīng)continued:聽(tīng)Overload聽(tīng)resolution聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)<span style="COLOR: #008000"></span></font> <font face="Courier New"> <span style="COLOR: #000000">bool聽(tīng)b;聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)i;聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">double</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)d;<br /></span> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)<span style="COLOR: #000000">f(聽(tīng)b聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(b)聽(tīng)with聽(tīng)T聽(tīng)=聽(tīng)bool聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">f(聽(tīng)i,聽(tīng)</span><span style="COLOR: #000000">42</span><span style="COLOR: #000000">,聽(tīng)d聽(tīng));聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(c)聽(tīng)with聽(tīng)T聽(tīng)=聽(tīng)int聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">f(聽(tīng)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(d)聽(tīng)with聽(tīng)T聽(tīng)=聽(tīng)int聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">f(聽(tīng)i聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(e)聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">f(聽(tīng)d聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(f)</span></font> </div> <p>涓婇潰璇寸殑榪欎簺鍏跺疄閮芥槸寰堢畝鍗曠殑鎯呭喌錛屽ぇ澶氭暟浜哄緢瀹規(guī)槗灝辮兘鏄庣櫧錛屼笅闈㈢殑鎵嶆槸瀹規(guī)槗璁╀漢寮勬販鐨勶細(xì)<br /><br />1.鑰冭檻濡備笅浠g爜錛?/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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)Example聽(tīng)2:聽(tīng)Explicit聽(tīng)specialization聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(a)聽(tīng)a聽(tīng)base聽(tīng)template聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)f(聽(tīng)T聽(tīng));<br /></span> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)<span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(b)聽(tīng)a聽(tīng)second聽(tīng)base聽(tīng)template,聽(tīng)overloads聽(tīng)(a)聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)(function聽(tīng)templates聽(tīng)can't聽(tīng)be聽(tīng)partially聽(tīng)<br /></span> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)<span style="COLOR: #008000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)specialized;聽(tīng)they聽(tīng)overload聽(tīng)instead)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)<span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(c)聽(tīng)explicit聽(tīng)specialization聽(tīng)of聽(tīng)(b)聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">12</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">13</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)...</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span>聽(tīng)<span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">15</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">p;聽(tīng)<br /></span> <span style="COLOR: #008080">16</span>聽(tīng)<span style="COLOR: #000000">f(聽(tīng)p聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)calls聽(tīng)(c)</span></font> </div> <p>鏈鍚庝竴琛岀殑緇撴灉鍍忓ぇ澶氭暟浜烘墍鏈熸湜鐨勪竴鏍鳳紝闂鏄細(xì)涓轟粈涔堟湡鏈涙槸榪欎釜緇撴灉錛?br />濡傛灉浣犳湡鏈涚殑鍘熷洜鏄敊璇殑錛屾帴涓嬫潵鐨勪竴瀹氫細(xì)璁╀綘濂藉銆備篃璁鎬綘浼?xì)璇村Q?鎴戜負(fù)<span style="COLOR: #3366ff">int*</span>鍐欎簡(jiǎn)涓涓壒鍖栫増鏈紝<span style="COLOR: #3366ff">f(p)</span>褰撶劧浼?xì)璋冪?span style="COLOR: #3366ff">c</span>"錛屼笉騫哥殑鏄紝榪欐鏄敊璇殑鍘熷洜!!!<br /><br />2.鍐嶈冭檻涓嬮潰鐨勪唬鐮侊細(xì)</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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)Example聽(tīng)3<br /></span> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(a)聽(tīng)same聽(tīng)old聽(tīng)base聽(tīng)template聽(tīng)as聽(tīng)before聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)f(聽(tīng)T聽(tīng));<br /></span> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)<span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(c)聽(tīng)explicit聽(tīng)specialization,聽(tīng)this聽(tīng)time聽(tīng)of聽(tīng)(a)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)<span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)(b)聽(tīng)a聽(tīng)second聽(tīng)base聽(tīng)template,聽(tīng)overloads聽(tīng)(a)聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">聽(tīng)f(聽(tīng)T</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng));<br /></span> <span style="COLOR: #008080">11</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">12</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)...</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">13</span>聽(tīng)<span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">p;聽(tīng)<br /></span> <span style="COLOR: #008080">15</span>聽(tīng)<span style="COLOR: #000000">f(聽(tīng)p聽(tīng));聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)calls聽(tīng)(b)!聽(tīng)overload聽(tīng)resolution聽(tīng)ignores聽(tīng)<br /></span> <span style="COLOR: #008080">16</span>聽(tīng)<span style="COLOR: #008000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">聽(tīng)specializations聽(tīng)and聽(tīng)operates聽(tīng)on聽(tīng)the聽(tīng)base聽(tīng)<br /></span> <span style="COLOR: #008080">17</span>聽(tīng)<span style="COLOR: #008000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聽(tīng)function聽(tīng)templates聽(tīng)only</span></font> </div> <p>濡傛灉榪欎釜緇撴灉璁╀綘鎰熷埌鎯婂錛岄偅灝卞浜?jiǎn)锛佸緢澶氫汉閮戒細(xì)鎰熷埌鎯婂锛?br />鐞嗚В榪欎釜鐨勫叧閿槸錛?em style="COLOR: #993300">Specializations don't overload,only the base templates overload.<br /></em><br />閲嶈澆瑙f瀽浠呬粎閫夋嫨base template(鎴栬卬ontemplate function錛屽鏋滄湁鐨勮瘽)錛屽彧鏈夊綋緙栬瘧鍣ㄥ凡緇忓喅瀹氫簡(jiǎn)鍝釜<br />base template灝嗕細(xì)琚夋嫨錛岀紪璇戝櫒鎵嶄細(xì)緇х畫寰涓嬪鎵鵑傚悎鐨勭壒鍖栫増鏈紝濡傛灉鎵懼埌浜?jiǎn)灏变娇鐢ㄩ偅涓壒鍖栫増鏈?br /><br />鏈鍚庯紝搴斿綋閬垮厤鐗瑰寲鍑芥暟妯℃澘錛屼篃瑕侀伩鍏嶉噸杞藉嚱鏁版ā鏉?nontemplate function鐨勯噸杞藉綋鐒舵病闂)銆傚鏋滀竴瀹氳榪欐牱錛屽彲浠ヤ嬌鐢ㄥ涓嬫柟娉曟ā鎷熷嚱鏁版ā鏉跨殑鍋忕壒鍖栵細(xì)</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"> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)1</span>聽(tīng)<span style="COLOR: #008000">//</span><span style="COLOR: #008000">base聽(tīng)template聽(tīng)class,聽(tīng)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)2</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template聽(tīng)</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)3</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">struct聽(tīng)FuncImpl聽(tīng){<br /></span> <span style="COLOR: #008080">聽(tīng)4</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">users,聽(tīng)go聽(tīng)ahead聽(tīng)and聽(tīng)specialize聽(tīng)this</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">聽(tīng)5</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)apply(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">聽(tīng)T聽(tīng)</span><span style="COLOR: #000000">&</span></font> <font face="Courier New"> <span style="COLOR: #000000">t)聽(tīng){<br /></span> <span style="COLOR: #008080">聽(tīng)6</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">0</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">聽(tīng)7</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)}<br /></span> <span style="COLOR: #008080">聽(tīng)8</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080">聽(tīng)9</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">partial聽(tīng)specialazation聽(tīng)for聽(tīng)int</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template聽(tīng)</span><span style="COLOR: #000000"><></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">12</span>聽(tīng)<span style="COLOR: #000000">struct聽(tīng)FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng){<br /></span> <span style="COLOR: #008080">13</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)apply(</span><span style="COLOR: #0000ff">int</span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)t)聽(tīng){<br /></span> <span style="COLOR: #008080">14</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">1</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">15</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)}<br /></span> <span style="COLOR: #008080">16</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080">17</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">18</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">partial聽(tīng)specialazation聽(tīng)for聽(tīng)T*</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">19</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template聽(tīng)</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">20</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)struct聽(tīng)FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T聽(tīng)</span><span style="COLOR: #000000">*></span></font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng){<br /></span> <span style="COLOR: #008080">21</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)apply(T聽(tīng)</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">t)聽(tīng){<br /></span> <span style="COLOR: #008080">22</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">2</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">23</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)}<br /></span> <span style="COLOR: #008080">24</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080">25</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">26</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">users,聽(tīng)don't聽(tīng)touch聽(tīng)this!</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">27</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">template聽(tīng)</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">聽(tīng)T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">28</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)func(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">聽(tīng)T聽(tīng)</span><span style="COLOR: #000000">&</span></font> <font face="Courier New"> <span style="COLOR: #000000">t)聽(tīng){<br /></span> <span style="COLOR: #008080">29</span>聽(tīng)<span style="COLOR: #000000">聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">聽(tīng)FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">></span></font> <font face="Courier New"> <span style="COLOR: #000000">::apply(t);<br /></span> <span style="COLOR: #008080">30</span>聽(tīng)</font> <font face="Courier New"> <span style="COLOR: #000000">}<br /></span> <span style="COLOR: #008080">31</span>聽(tīng)</font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">32</span>聽(tīng)<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">聽(tīng)i聽(tīng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">聽(tīng)</span><span style="COLOR: #000000">10</span></font> <font face="Courier New"> <span style="COLOR: #000000">,聽(tīng)r;<br /></span> <span style="COLOR: #008080">33</span>聽(tīng)<span style="COLOR: #000000">r聽(tīng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">聽(tīng)func(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r聽(tīng)=聽(tīng)0</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">34</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">r聽(tīng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">聽(tīng)func(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r聽(tīng)=聽(tīng)1</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">35</span>聽(tīng)<span style="COLOR: #008000"></span><span style="COLOR: #000000">r聽(tīng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">聽(tīng)func(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i);聽(tīng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r聽(tīng)=聽(tīng)2</span></font> </div> <img src ="http://www.shnenglu.com/ant/aggbug/31201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ant/" target="_blank">铓傝殎緇堢粨鑰?/a> 2007-08-30 13:55 <a href="http://www.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浠嶹in32 API灝佽Thread綾籟1]http://www.shnenglu.com/ant/archive/2007/08/30/31190.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 02:18:00 GMThttp://www.shnenglu.com/ant/archive/2007/08/30/31190.htmlhttp://www.shnenglu.com/ant/comments/31190.htmlhttp://www.shnenglu.com/ant/archive/2007/08/30/31190.html#Feedback8http://www.shnenglu.com/ant/comments/commentRss/31190.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31190.html鍓嶅嚑澶╁湪瀛indows澶氱嚎紼嬬▼搴忚璁★紝鍙戠幇Win32 API鐢ㄨ搗鏉ョ‘瀹炰笉鎬庝箞鏂逛究錛岀壒鍒槸瀵逛簬C++紼嬪簭鍛樸備簬鏄疄鐜頒簡(jiǎn)涓涓畝鍗曠殑灝佽錛屾妧鏈惈閲忓綋鐒朵笉楂橈紝涓嶈繃鐢ㄨ搗鏉ヨ繕鏄瘮杈冩柟渚跨殑銆傚鏋滀綘鐔熸?zhèn)塉ava錛屼綘浼?xì)鍙戠幇杩欎釜瀹炵幇鏈夌偣鍍廕ava鐨凾hread錛屽湪Java涓湁涓ょ鏂規(guī)硶鍙互鍒涘緩涓涓猅hread錛?br />
1.浠嶵hread綾葷戶鎵垮茍瀹炵幇run鏂規(guī)硶錛?/p>
1聽(tīng)class聽(tīng)MyThread聽(tīng)extends 聽(tīng)Thread聽(tīng){
2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void
聽(tīng)run()聽(tīng){
3聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
4聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}聽(tīng)
5聽(tīng)
};
6聽(tīng)

7聽(tīng)//寮鍚嚎紼?/span>
8聽(tīng)MyThread聽(tīng)thread聽(tīng)=聽(tīng)new 聽(tīng)MyThread;
9聽(tīng)thread.start();

2.澹版槑涓涓被瀹炵幇Runnable鎺ュ彛騫跺疄鐜皉un鏂規(guī)硶錛?/p>

1聽(tīng)class聽(tīng)MyRunnable聽(tīng)implements 聽(tīng)Runnable聽(tīng){
2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void
聽(tīng)run()聽(tīng){
3聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
4聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
5聽(tīng)
};
6聽(tīng)

7聽(tīng)//聽(tīng)寮鍚嚎紼嬄?/span>
8聽(tīng)MyThread聽(tīng)thread聽(tīng)=聽(tīng)new聽(tīng)MyThread(new 聽(tīng)MyRunnable);
9聽(tīng)thread.start();


鍏蜂綋瀹炵幇
Java鐨勫疄鐜版柟寮忚繕綆椾紭闆咃紝鎴戜滑涔熷彲浠ュ湪C++涓ā鎷燂紝鐢變簬綃囧箙鎵闄愶紝鍦ㄨ繖閲屾垜浠彧鍏蟲敞鍩烘湰鍔熻兘鐨勫疄鐜幫細(xì)
thread.h
聽(tīng)1聽(tīng)#ifndef聽(tīng)THREAD_H
聽(tīng)2聽(tīng)
#define聽(tīng)THREAD_H
聽(tīng)3聽(tīng)

聽(tīng)4聽(tīng)#include聽(tīng)<windows.h>
聽(tīng)5聽(tīng)
聽(tīng)6聽(tīng)#define聽(tīng)CLASS_UNCOPYABLE(classname)聽(tīng)\
聽(tīng)7聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)private
:聽(tīng)\
聽(tīng)8聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname(const聽(tīng)classname&
);聽(tīng)\
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname&聽(tīng)operator=(const聽(tīng)classname&
);
10聽(tīng)

11聽(tīng)struct聽(tīng)Runnable聽(tīng){
12聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void聽(tīng)run()聽(tīng)=聽(tīng)0
;
13聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)~
Runnable()聽(tīng){}
14聽(tīng)
};
15聽(tīng)

16聽(tīng)class聽(tīng)Thread聽(tīng):聽(tīng)public聽(tīng)Runnable聽(tīng){
17聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(Thread)
18聽(tīng)public
:
19聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)explicit聽(tīng)Thread(Runnable* target聽(tīng)=聽(tīng)0
);
20聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)~
Thread();
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){}
22聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)start();
23聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)void
聽(tīng)join();
24聽(tīng)private
:
25聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)static聽(tīng)unsigned聽(tīng)__stdcall聽(tīng)threadProc(void*
param);
26聽(tīng)private
:
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Runnable*
_target;
28聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)HANDLE聽(tīng)_handle;
29聽(tīng)
};
30聽(tīng)

31聽(tīng)#endif/*THREAD_H*/

鍦ㄤ笂闈㈢殑浠g爜涓垜浠厛瀹氫箟涓涓猂unnable綾伙紝騫朵負(fù)Runnable綾繪坊鍔犵函铏氬嚱鏁皉un錛岄渶瑕佺壒鍒敞鎰忕殑鏄疪unnable綾葷殑铏氭瀽鏋勫嚱鏁幫紝浠諱綍鎯寵鎴愪負(fù)鍩虹被鐨刢lass閮藉簲璇ュ0鏄庢瀽鏋勫嚱鏁頒負(fù)virtual銆?br />Thread綾葷洿鎺ョ戶鎵胯嚜Runnable錛孋LASS_UNCOPYABLE(Thread) 榪欎竴琛岀敤瀹忓0鏄嶵hread綾諱笉鍙嫹璐濓紝鍏蜂綋緇嗚妭璇風(fēng)湅 鑰冭檻鐢∕acro鏇挎崲Uncopyable 銆俿tart鎴愬憳鍑芥暟鍜孞ava涓殑涓鏍鳳紝鐢ㄦ潵寮鍚竴涓嚎紼嬶紝join鎴愬憳鍑芥暟鐢ㄦ潵闃誨褰撳墠綰跨▼鐩村埌寮鍚殑綰跨▼鎵ц瀹屾瘯銆倀hreadProc浣滀負(fù)闈?rùn)鎬佹垚鍛樺嚱鏁扮敤鏉ヤ紶閫掔粰_beginthreadex錛岃嚦浜庝負(fù)浠涔堢敤_beginthreadex浠f浛CreateThread璇烽棶Google銆傚垵姝ョ殑瀹炵幇閮芥瘮杈冪畝鍗曪紝鐩存帴璐翠笂浠g爜錛?br />thread.cpp
聽(tīng)1聽(tīng)#include聽(tīng)"thread.h"
聽(tīng)2聽(tīng)#include聽(tīng)<process.h>聽(tīng)// for聽(tīng)_beginthreadex
聽(tīng)3聽(tīng)
聽(tīng)4聽(tīng)Thread::Thread(Runnable* target聽(tīng)/*=聽(tīng)0*/)
聽(tīng)5聽(tīng):_target(target
)
聽(tīng)6聽(tīng),_handle(0
)聽(tīng){
聽(tīng)7聽(tīng)

聽(tīng)8聽(tīng)}
聽(tīng)9聽(tīng)

10聽(tīng)Thread::~Thread()聽(tīng){
11聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(_handle聽(tīng)!=聽(tīng)0
)
12聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CloseHandle(_handle);
13聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(_target聽(tīng)!=聽(tīng)0
)
14聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)delete聽(tīng)_target;
15聽(tīng)
}
16聽(tīng)

17聽(tīng)void聽(tīng)Thread::start()聽(tīng){
18聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(_handle聽(tīng)!=聽(tīng)0
)
19聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return
;
20聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)unsigned聽(tīng)id;
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_handle聽(tīng)=聽(tīng)reinterpret_cast<HANDLE>
(
22聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_beginthreadex(0,聽(tīng)0,聽(tīng)threadProc,聽(tīng)this,聽(tīng)0,聽(tīng)&
id)
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng));
24聽(tīng)
}
25聽(tīng)

26聽(tīng)void聽(tīng)Thread::join()聽(tīng){
27聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if(_handle聽(tīng)!=聽(tīng)0
)聽(tīng){
28聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)WaitForSingleObject(_handle,聽(tīng)I(yíng)NFINITE);
29聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CloseHandle(_handle);
30聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)_handle聽(tīng)=聽(tīng)0
;
31聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
32聽(tīng)
}
33聽(tīng)

34聽(tīng)unsigned聽(tīng)__stdcall聽(tīng)Thread::threadProc(void* param)聽(tīng){
35聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread* p聽(tīng)=聽(tīng)static_cast<Thread*>
(param);
36聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(p->_target聽(tīng)!=聽(tīng)0
)
37聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)p->_target->
run();
38聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)else

39聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)p->run();
40聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)0
;
41聽(tīng)}

涓嬮潰鏄祴璇曚唬鐮侊細(xì)
test.cpp
聽(tīng)1聽(tīng)#include聽(tīng)"thread.h"
聽(tīng)2聽(tīng)#include聽(tīng)<iostream>
聽(tīng)3聽(tīng)
聽(tīng)4聽(tīng)using聽(tīng)namespace聽(tīng)std;
聽(tīng)5聽(tīng)

聽(tīng)6聽(tīng)//絎竴縐嶆柟娉曪紝浠嶵hread綾葷戶鎵?/span>
聽(tīng)7聽(tīng)struct聽(tīng)MyThread聽(tīng):聽(tīng)public聽(tīng)Thread聽(tīng){
聽(tīng)8聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){
聽(tīng)9聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(int聽(tīng)i聽(tīng)=聽(tīng)0;聽(tīng)i聽(tīng)<聽(tīng)5;聽(tīng)++
i)聽(tīng){
10聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"MyThread聽(tīng)Running..."聽(tīng)<<聽(tīng)i聽(tīng)<<
聽(tīng)endl;
11聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Sleep(100
);
12聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
13聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
14聽(tīng)
};
15聽(tīng)

16聽(tīng)//絎簩縐嶆柟娉曪紝鈥滃疄鐜扳漅unnable鎺ュ彛
17聽(tīng)struct聽(tīng)MyRunnable聽(tīng):聽(tīng)public聽(tīng)Runnable聽(tīng){
18聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)virtual聽(tīng)void
聽(tīng)run()聽(tīng){
19聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(int聽(tīng)i聽(tīng)=聽(tīng)0;聽(tīng)i聽(tīng)<聽(tīng)5;聽(tīng)++
i)聽(tīng){
20聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)cout聽(tīng)<<聽(tīng)"MyRunnable聽(tīng)Running..."聽(tīng)<<聽(tīng)i聽(tīng)<<
聽(tīng)endl;
21聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Sleep(300
);
22聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
23聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
24聽(tīng)
};
25聽(tīng)

26聽(tīng)int聽(tīng)main()聽(tīng){
27聽(tīng)

28聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)MyThread聽(tīng)thread1;
29聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Thread聽(tīng)thread2(new
聽(tīng)MyRunnable());
30聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread1.start();
31聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread2.start();
32聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread1.join();
33聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)thread2.join();
34聽(tīng)

35聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)0;
36聽(tīng)}

鍙兘鐨勮繍琛岀粨鏋滐細(xì)
MyThread Running...0
MyRunnable Running...0
MyThread Running...1
MyThread Running...2
MyRunnable Running...1
MyThread Running...3
MyThread Running...4
MyRunnable Running...2
MyRunnable Running...3
MyRunnable Running...4


濡傛灉浣犵啛鎮(zhèn)塨oost搴擄紝浣犱細(xì)鐭ラ亾boost搴撶殑Thread鏋勯犲嚱鏁板彲浠ユ帴鍙楁櫘閫氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負(fù)鍙傛暟錛屽鏋滀綘瑙夊緱浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛榪樹(shù)笉澶熺畝媧侊紝涓嬩竴綃囦細(xì)鏈変竴涓瘮杈冨ソ鐨勬敼榪涖?

]]>
鑰冭檻鐢∕acro鏇挎崲Uncopyablehttp://www.shnenglu.com/ant/archive/2007/08/27/30908.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Mon, 27 Aug 2007 00:11:00 GMThttp://www.shnenglu.com/ant/archive/2007/08/27/30908.htmlhttp://www.shnenglu.com/ant/comments/30908.htmlhttp://www.shnenglu.com/ant/archive/2007/08/27/30908.html#Feedback2http://www.shnenglu.com/ant/comments/commentRss/30908.htmlhttp://www.shnenglu.com/ant/services/trackbacks/30908.html1. 灝嗚繖涓被鐨刢opy鏋勯犲嚱鏁板拰copy assignment鎿嶄綔絎﹂兘澹版槑涓簆rivate鑰屼笖娌℃湁瀹氫箟銆傜ず渚嬩唬鐮佸涓嬶細(xì)
1聽(tīng)class聽(tīng)SomeClass聽(tīng){
2聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
3聽(tīng)private
:
4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//鍙湁澹版槑

5聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)SomeClass(const聽(tīng)SomeClass&);
6聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)SomeClass&聽(tīng)operator=(const聽(tīng)SomeClass&
);
7聽(tīng)};

2. 涓撻棬璁捐涓涓負(fù)浜?jiǎn)闃绘copying鍔ㄤ綔鑰岃璁$殑base class錛岃繖涓猙ase class鐩稿綋綆鍗曪細(xì)
1聽(tīng)Uncopyable聽(tīng){
2聽(tīng)protected:聽(tīng)//鍏佽derived瀵硅薄鏋勯犲拰鏋愭瀯

3聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Uncopyable()聽(tīng){}
4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)~
Uncopyable()聽(tīng){}
5聽(tīng)private:聽(tīng)//闃繪copying

6聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Uncopyable(const聽(tīng)Uncopyable&);
7聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Uncopyable&聽(tīng)operator=(const聽(tīng)Uncopyable&
);
8聽(tīng)};

涓轟簡(jiǎn)闃繪鏌愪釜瀵硅薄濡係omeClass琚玞opying錛屾垜浠敮涓闇瑕佸仛鐨勫氨鏄戶鎵胯嚜Uncopyable錛?br />
1聽(tīng)SomeClass聽(tīng):聽(tīng)private聽(tīng)Uncopyable聽(tīng){
2聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
3聽(tīng)};

絎?縐嶆柟妗堣矊浼煎緢瀹岀編錛屽湪澶у鏁版儏鍐典笅涔熷伐浣滅殑寰堝ソ錛岀敋鑷砨oost搴撲篃騫挎硾閲囩敤浜?boost搴撲腑鐨勫彨noncopyable)銆傚綋鐒朵簡(jiǎn)錛屽洜涓篣ncopyable涓嶅惈浠諱綍鏁版嵁錛岀鍚圗BO(empty base class optimization錛岀┖鐧藉熀綾繪渶浼樺寲)璧勬牸錛屼絾鐢變簬瀹冩繪槸鎵紨base class錛屽洜姝ゆ湁鍙兘瀵艱嚧澶氶噸緇ф壙錛岃孍BO涓鑸彧鍦ㄥ崟緇ф壙涓嬫墠鍙錛岀紪璇戝櫒閫氬父涓嶄細(xì)瀵規(guī)湁澶氫釜base class鐨刣erived classes鏂借EBO銆?br />
濡傛灉浣犱笉鎯沖鑷村閲嶇戶鎵匡紝涓嶇鏄粠鎬ц兘涓婅繕鏄功鍐欎唬鐮佷笂錛屾瘮濡係omeClass緇ф壙鑷煇涓猙ase class錛屼綘鍙兘浼?xì)鍐欏涓嬩唬鐮佸Q?br />
1聽(tīng)class聽(tīng)SomeClass聽(tīng):聽(tīng)public聽(tīng)BaseClass,聽(tīng)private聽(tīng)Uncopyable聽(tīng){
2聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
3聽(tīng)};

榪欒浜哄緢涓嶇埥錛岃鏄綘璺熸垜涓鏍鋒噿錛屼綘鑲畾涔熶笉浼?xì)鎰挎剰閲囩敤绗竴縐嶆柟妗堬紝鍥犱負(fù)閭f剰鍛崇潃浣犱細(xì)鍦ㄦ瘡涓涓笉鎯寵copying鐨刢lass閲岄兘鍔犱笂閭d笁琛屼唬鐮併?br />
濡傛灉鐢∕acro灝卞緢綆鍗曚簡(jiǎn)錛屽嵆鐏墊椿鍙堟柟渚匡細(xì)
1聽(tīng)#define聽(tīng)CLASS_UNCOPYABLE(classname)聽(tīng)\
2聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)private
:聽(tīng)\
3聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname(const聽(tīng)classname&
);聽(tīng)\
4聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)classname&聽(tīng)operator=(const聽(tīng)classname&);

鐜板湪SomeClass鍙渶鍐欐垚榪欐牱錛?br />
1聽(tīng)class聽(tīng)SomeClass聽(tīng){
2聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)CLASS_UNCOPYABLE(SomeClass)
3聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)...
4聽(tīng)};

涓嶄粎鐪佷簨鑰屼笖鐏墊椿錛侊紒錛?img src ="http://www.shnenglu.com/ant/aggbug/30908.html" width = "1" height = "1" />

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉成人久久| 老司机久久99久久精品播放免费| 免费不卡中文字幕视频| 亚洲国产色一区| 亚洲一区国产视频| 久久精品99无色码中文字幕| 亚洲美女一区| 久久亚洲精品一区| 国产欧美欧美| 一区二区三区四区五区精品视频| 欧美综合国产精品久久丁香| 亚洲乱码视频| 欧美精品在线网站| 亚洲欧洲日产国产综合网| 久久久精品视频成人| 夜夜嗨av一区二区三区网站四季av| 久久中文精品| 一区二区三区高清不卡| 亚洲欧美日韩天堂| 国产精品国产三级国产专播精品人 | 怡红院精品视频| 亚洲一本视频| 免费观看成人网| 欧美日本韩国一区| 久久精品视频va| 欧美精品九九| 一本色道久久综合狠狠躁的推荐| 欧美国产欧美综合 | 欧美大片专区| 巨乳诱惑日韩免费av| 国产精品99久久久久久www| 亚洲激情不卡| 欧美sm重口味系列视频在线观看| 亚洲第一精品影视| 欧美大片第1页| 国产精品护士白丝一区av| 欧美成人国产| 欧美区视频在线观看| 久久嫩草精品久久久精品| 欧美在线免费| 在线观看av一区| 亚洲欧美国产精品专区久久| 国产一区二区你懂的| 欧美暴力喷水在线| 国产日韩综合一区二区性色av| 久久精品99国产精品日本| 欧美日韩在线免费观看| 欧美伊人久久| 久久男人av资源网站| 久久se精品一区精品二区| 欧美系列精品| 久久偷窥视频| 欧美国产激情二区三区| 亚洲天天影视| 亚洲国产高清aⅴ视频| 欧美高清视频一二三区| 蜜月aⅴ免费一区二区三区| 国产精品入口尤物| 毛片一区二区三区| 欧美日韩高清一区| 久久久久久网址| 国产午夜精品久久| 欧美一区二区三区男人的天堂| 亚洲国产欧美精品| 亚洲一级片在线观看| 亚洲电影在线| 老司机免费视频久久| 亚洲第一网站免费视频| 亚洲国产精品成人综合色在线婷婷| 99成人在线| 亚洲欧美日本国产专区一区| 久久国产综合精品| 宅男精品视频| 国产精品久久久久久久电影| 在线亚洲免费| 日韩视频一区| 久久精品一区四区| 亚洲女同性videos| 国产欧美精品一区二区三区介绍| 小黄鸭视频精品导航| 毛片精品免费在线观看| 亚洲美女在线观看| 欧美午夜久久久| 欧美一区观看| 亚洲高清网站| 亚洲男人影院| 影音先锋日韩资源| 欧美日韩国产精品| 欧美亚洲一区二区在线| 欧美成人有码| 亚洲欧美不卡| 136国产福利精品导航网址应用| 欧美精品1区| 新片速递亚洲合集欧美合集| 欧美激情网站在线观看| 亚洲欧美日韩在线高清直播| 国产自产精品| 欧美中文字幕视频在线观看| 亚洲国产成人一区| 欧美亚洲综合久久| 国产精品一区三区| 亚洲欧美在线磁力| 亚洲激情自拍| 久久久久久久网| 亚洲视频第一页| 黄页网站一区| 美女91精品| 亚洲风情在线资源站| 午夜激情一区| 黄色av成人| 狂野欧美激情性xxxx| 亚洲视屏在线播放| 欧美高清视频在线| 久久av红桃一区二区小说| 日韩一级免费| 国产精品久久久久久久午夜| 亚洲影院色在线观看免费| 久久99在线观看| 亚洲视频一区二区在线观看 | 亚洲国产精品一区二区第四页av | 国产精品久久激情| 麻豆乱码国产一区二区三区| 羞羞色国产精品| 亚洲天堂成人在线视频| 亚洲欧洲精品天堂一级| 久久精品中文字幕免费mv| 亚洲欧美综合网| 亚洲综合首页| 亚洲无亚洲人成网站77777| 亚洲精品乱码久久久久久| 欧美国产在线视频| 久久这里有精品视频| 欧美一区二区在线免费播放| 亚洲女同精品视频| 亚洲一二区在线| 中文亚洲免费| 一区二区高清| 猛干欧美女孩| 久久综合色影院| 久久综合福利| 美女啪啪无遮挡免费久久网站| 久久九九精品| 老司机免费视频一区二区| 久热精品在线视频| 老司机精品导航| 欧美国产激情二区三区| 亚洲电影观看| 亚洲伦伦在线| 亚洲影音一区| 久久国产婷婷国产香蕉| 久久五月激情| 欧美激情一区二区三区高清视频 | 国产一区二区三区黄视频| 国产女人精品视频| 国产中文一区二区三区| 亚洲成人影音| 一本不卡影院| 久久成人在线| 欧美a级片网站| 最新中文字幕亚洲| 亚洲一区在线直播| 久久久噜噜噜久久久| 亚洲手机在线| 久久国产精品久久久| 免费亚洲一区| 国产精品成人v| 今天的高清视频免费播放成人| 在线欧美一区| 亚洲一二三四区| 久久久久久欧美| 亚洲精品综合在线| 亚洲欧美在线免费| 久久全球大尺度高清视频| 欧美日韩1区| 红桃视频欧美| 亚洲一区日本| 欧美福利电影网| 午夜久久久久久| 欧美日本一道本| 国产亚洲激情在线| 一本色道久久综合亚洲精品不| 欧美一区二区高清在线观看| 欧美激情一区二区三区在线视频观看 | 免费观看亚洲视频大全| 日韩一级精品视频在线观看| 欧美中文字幕精品| 欧美性猛交xxxx免费看久久久| 激情国产一区二区| 亚洲欧美久久| 最新国产の精品合集bt伙计| 欧美一级在线视频| 欧美日韩一区二区三区视频| 牛人盗摄一区二区三区视频| 国产精品永久| 99re8这里有精品热视频免费| 久久精品视频va| 亚洲一区二区少妇| 欧美日韩国产三区| 亚洲精选视频免费看| 久久久亚洲精品一区二区三区|