锘??xml version="1.0" encoding="utf-8" standalone="yes"?>青青草国产精品久久久久,免费国产99久久久香蕉,久久高潮一级毛片免费 http://www.shnenglu.com/ant/The dreams in which I'm dying are the best I've ever had... zh-cn Tue, 06 May 2025 19:00:58 GMT Tue, 06 May 2025 19:00:58 GMT 60 strlen婧愮爜鍓栨瀽 http://www.shnenglu.com/ant/archive/2007/10/12/32886.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 12 Oct 2007 05:19:00 GMT http://www.shnenglu.com/ant/archive/2007/10/12/32886.html http://www.shnenglu.com/ant/comments/32886.html http://www.shnenglu.com/ant/archive/2007/10/12/32886.html#Feedback 34 http://www.shnenglu.com/ant/comments/commentRss/32886.html http://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 GMT http://www.shnenglu.com/ant/archive/2007/10/12/31326.html http://www.shnenglu.com/ant/comments/31326.html http://www.shnenglu.com/ant/archive/2007/10/12/31326.html#Feedback 14 http://www.shnenglu.com/ant/comments/commentRss/31326.html http://www.shnenglu.com/ant/services/trackbacks/31326.html 闃呰鍏ㄦ枃 ]]> Win32 Service鐨勭畝鍗曞皝瑁?/title> http://www.shnenglu.com/ant/archive/2007/09/24/32769.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Mon, 24 Sep 2007 05:01:00 GMT http://www.shnenglu.com/ant/archive/2007/09/24/32769.html http://www.shnenglu.com/ant/comments/32769.html http://www.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback 5 http://www.shnenglu.com/ant/comments/commentRss/32769.html http://www.shnenglu.com/ant/services/trackbacks/32769.html 鍓嶆鏃墮棿瀛︿範Windows紼嬪簭璁捐錛屽垰濂藉鍒癢in32 Service錛屼簬鏄啓浜嗕袱涓畝鍗曠殑綾伙細BaseService鍜孲erviceCtrl銆傝櫧鐒跺姛鑳芥瘮杈冪畝鍗曪紝浣嗘槸涔熻兘閫傜敤浜庡ぇ澶氭暟鎯呭喌銆備笅闈粙緇嶄竴涓嬬畝鍗曠敤娉曪紝濡傛灉浣犲垰濂介渶瑕佸啓涓浜涚畝鍗曠殑鏈嶅姟紼嬪簭錛岃繖涓や釜綾諱篃璁歌兘媧句笂鐢ㄥ満錛?br>1. BaseService BaseService.h
1 #ifndef BASE_SERVICE_H 2 #define BASE_SERVICE_H 3 4 class BaseService { 5 public : 6 explicit BaseService(LPCTSTR szServiceName, 7 DWORD dwServiceType = SERVICE_WIN32_OWN_PROCESS, 8 DWORD dwStartType = SERVICE_AUTO_START); 9 virtual ~ BaseService() {} 10 bool ParseStandardArgs( int argc, char * argv[]); 11 bool IsInstalled(); 12 bool Install(); 13 bool Uninstall(); 14 bool Start(); 15 private : 16 virtual void Run() = 0 ; 17 virtual bool OnInitialize() { return true ; } 18 virtual void OnStop() {} 19 virtual void OnPause() {} 20 virtual void OnContinue() {} 21 virtual void OnInterrogate() {} 22 virtual void OnShutdown() {} 23 virtual void OnUserControl(DWORD dwControl) {} 24 ... 25 }; 26 27 #endif /* BASE_SERVICE_H */
瑕佸疄鐜拌嚜宸辯殑鏈嶅姟綾誨彧闇浠嶣aseService緇ф壙騫朵笖Override鐩稿叧鐨剉irtual鍑芥暟鍗沖彲錛屼笅闈㈢ず鑼冧竴涓狟eepService綾伙紝璇ユ湇鍔″彧鏄畝鍗曞湴姣忛殧2縐抌eep涓涓嬶紝涓轟簡綆鍗曟墍鏈変唬鐮佸潎鏀懼湪.h鏂囦歡涓細BeepService.h
1 #ifndef BEEP_SERVICE_H 2 #define BEEP_SERVICE_H 3 4 #include " BaseService.h " 5 6 class BeepService : public BaseService { 7 public : 8 BeepService(LPCTSTR szServiceName) 9 :BaseService(szServiceName) 10 ,m_bPaused( false ) 11 ,m_bRunning( false ) {} 12 13 virtual void OnStop() { m_bRunning = false ; } 14 virtual void OnPause() { m_bPaused = true ; } 15 virtual void OnContinue() { m_bPaused = false ; } 16 virtual void Run() { 17 m_bRunning = true ; 18 while (m_bRunning) { 19 if ( ! m_bPaused) 20 Beep( 800 , 800 ); 21 Sleep( 2000 ); 22 } 23 } 24 private : 25 volatile bool m_bPaused; 26 volatile bool m_bRunning; 27 }; 28 29 #endif /* BEEP_SERVICE_H */
閫氬父鏉ヨ鍙』瑕丱verride涓婇潰鐨?涓獀irtual鍑芥暟灝監K浜嗭細 鍦?em>Run()涓繘琛屽疄闄呯殑宸ヤ綔錛?em>OnStop(),OnPause(),OnContinue()鍒欐槸涓轟簡鍝嶅簲Service Control Manager鐨勬帶鍒躲?br> test.cpp
1 #include < windows.h > 2 #include < tchar.h > 3 #include < stdio.h > 4 #include " BeepService.h " 5 6 int main( int argc, char * argv[]) { 7 8 BeepService beepService(_T( " BeepService " )); 9 if ( ! beepService.ParseStandardArgs(argc, argv)) { 10 if (beepService.IsInstalled()) { 11 if ( ! beepService.Start()) 12 printf( " The service can not run from command line.\n " ); 13 } else { 14 printf( " The service is not installed, " 15 " use \ " % s - i\ " to install.\n " , argv[ 0 ]); 16 } 17 } 18 return 0 ; 19 }
鍋囪緙栬瘧鍚庣敓鎴愮殑exe鏂囦歡涓篵eep.exe錛屽垯鍦ㄥ懡浠よ涓彲浠ュ涓嬩嬌鐢細(1). beep -i 瀹夎service(瀹夎浠ュ悗緋葷粺榪愯鏃朵細鑷姩鍚姩) (2). beep -u 鍗歌澆service(濡傛灉service姝e湪榪愯錛屽垯鍏堝仠姝ervice鍐嶅嵏杞? BaseServiced 鐨凱arseStandardArgs姝f槸鐢ㄦ潵瑙f瀽涓婅堪涓や釜鍛戒護銆?br>2. ServiceCtrl 铏界劧Windows鑷甫鐨凷ervice Control Manager鍙互鎺у埗鏈嶅姟紼嬪簭錛屼絾鏄緢澶氭椂鍊欐垜浠兘闇瑕佺敤浠g爜鎺у埗錛岃繖灝辯敤鍒癝erviceCtrl綾伙紝璇ョ被鐨勬帴鍙e涓嬶細ServiceCtrl.h
1 #ifndef SERVICE_CTRL_H 2 #define SERVICE_CTRL_H 3 4 class ServiceCtrl { 5 public : 6 ServiceCtrl(LPCTSTR szServiceName); 7 ~ ServiceCtrl(); 8 bool Start(); 9 bool Pause(); 10 bool Continue(); 11 bool Stop(); 12 bool Interrogate(); 13 bool UserControl(DWORD dwControl); 14 DWORD State() const ; 15 ... 16 }; 17 18 #endif /* SERVICE_CTRL_H */
鎺ュ彛姣旇緝鐩磋娌′粈涔堝ソ璇寸殑錛岀湅涓嬮潰鐨勭ず渚嬩唬鐮侊細test.cpp
1 #include < windows.h > 2 #include < tchar.h > 3 #include < stdio.h > 4 #include < exception > 5 #include " BeepService.h " 6 #include " ServiceCtrl.h " 7 8 int main( int argc, char * argv[]) { 9 10 try { 11 ServiceCtrl servCtrl(_T( " BeepService " )); 12 if (servCtrl.State() != SERVICE_STOPPED) { 13 printf( " Service already started.\n " ); 14 } else { 15 servCtrl.Start(); 16 printf( " Start.\n " ); 17 Sleep( 6000 ); 18 servCtrl.Pause(); 19 printf( " Pause.\n " ); 20 Sleep( 6000 ); 21 servCtrl.Continue(); 22 printf( " Continue.\n " ); 23 Sleep( 6000 ); 24 servCtrl.Stop(); 25 printf( " Stop.\n " ); 26 } 27 } catch (std::exception & e) { 28 printf( " %s\n " , e.what()); 29 } 30 return 0 ; 31 }
婧愪唬鐮侊細鐐瑰嚮涓嬭澆
]]>MD5綆楁硶鐨凜++瀹炵幇 http://www.shnenglu.com/ant/archive/2007/09/11/31886.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Tue, 11 Sep 2007 04:20:00 GMT http://www.shnenglu.com/ant/archive/2007/09/11/31886.html http://www.shnenglu.com/ant/comments/31886.html http://www.shnenglu.com/ant/archive/2007/09/11/31886.html#Feedback 121 http://www.shnenglu.com/ant/comments/commentRss/31886.html http://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 GMT http://www.shnenglu.com/ant/archive/2007/09/07/31786.html http://www.shnenglu.com/ant/comments/31786.html http://www.shnenglu.com/ant/archive/2007/09/07/31786.html#Feedback 13 http://www.shnenglu.com/ant/comments/commentRss/31786.html http://www.shnenglu.com/ant/services/trackbacks/31786.html 4.瑙e喅澶氱嚎紼嬮棶棰?br />涓婁竴綃囧疄鐜扮殑Singleton鍙兘鍦ㄥ崟綰跨▼鐜涓嬌鐢紝鍦ㄥ綰跨▼鐜涓細鍑虹幇寰堝闂錛岀湅Instance()瀹炵幇浠g爜錛?br />1 聽static 聽Singleton & 聽Instance()聽{ 2 聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{聽 // 1 3 聽聽聽聽聽聽聽聽聽_instance聽 = 聽 new 聽Singleton();聽 // 2 4 聽聽聽聽聽聽聽聽聽atexit(Destroy); 5 聽聽聽聽聽} 6 聽聽聽聽聽 return 聽 * _instance;聽 // 3 7 聽}
鑰冭檻濡備笅鎯呭喌錛氱嚎紼嬩竴璋冪敤Instance()錛岃繘鍏?/1錛? == _instance 榪斿洖true錛岀嚎紼嬩竴浜庢槸榪涘叆//2銆傝繖鏃跺欑嚎紼嬩竴琚寕璧鳳紝綰跨▼浜屽紑濮嬫墽琛岋紝綰跨▼浜岃皟鐢↖nstance()錛岃繘鍏?/1錛屽彂鐜? == _instance 浠嶇劧榪斿洖true錛岀嚎紼嬩簩浜庢槸涔熻繘鍏?/2錛岀嚎紼嬩簩緇х畫鎵ц鍒?/3鐩村埌榪斿洖銆傝繖鏃跺欑嚎紼嬩竴琚敜閱掞紝緇х畫浠?/2寮濮嬫墽琛岋紝榪欏皢浼氳鐩栫嚎紼嬩簩鍒涘緩鐨刜instance錛岀嚎紼嬩竴緇х畫鎵ц鍒?/3鐩村埌榪斿洖... 瑙e喅鏂規硶寰堢畝鍗曪紝寮曞叆鐩稿叧鍚屾瀵硅薄(synchronization object)灝辮浜嗭紝渚嬪鍦╳in32騫沖彴涓嬪彲浠ュ涓嬪疄鐜幫細synobj.h 聽1 聽#ifndef聽SYNOBJ_H 聽2 聽#define聽SYNOBJ_H 聽3 聽聽4 聽#include聽 < windows.h > 聽5 聽聽6 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 聽7 聽聽聽聽聽 private :聽\ 聽8 聽聽聽聽聽classname( const 聽classname & );聽\ 聽9 聽聽聽聽聽classname & 聽operator = ( const 聽classname & ); 10 聽11 聽class 聽Mutex聽{ 12 聽聽聽聽聽CLASS_UNCOPYABLE(Mutex) 13 聽public : 14 聽聽聽聽聽Mutex()聽:_cs()聽{聽InitializeCriticalSection( & _cs);聽} 15 聽聽聽聽聽 ~ Mutex()聽{聽DeleteCriticalSection( & _cs);聽} 16 聽聽聽聽聽 void 聽lock()聽{聽EnterCriticalSection( & _cs);聽} 17 聽聽聽聽聽 void 聽unlock()聽{聽LeaveCriticalSection( & _cs);聽} 18 聽private : 19 聽聽聽聽聽CRITICAL_SECTION聽_cs; 20 聽}; 21 聽22 聽class 聽Lock聽{ 23 聽聽聽聽聽CLASS_UNCOPYABLE(Lock) 24 聽public : 25 聽聽聽聽聽explicit聽Lock(Mutex & 聽cs)聽:_cs(cs)聽{聽_cs.lock();聽} 26 聽聽聽聽聽 ~ Lock()聽{聽_cs.unlock();聽} 27 聽private : 28 聽聽聽聽聽Mutex & 聽_cs; 29 聽}; 30 聽31 聽#endif /* SYNOBJ_H */
鏈変簡鍚屾瀵硅薄寰堝鏄撳氨鑳藉鍐欏嚭濡備笅浠g爜錛?br />singleton.h 聽1 聽#ifndef聽SINGLETON_H 聽2 聽#define聽SINGLETON_H 聽3 聽聽4 聽#include聽 " synobj.h " 聽5 聽聽6 聽class 聽Singleton聽{ 聽7 聽public : 聽8 聽聽聽聽聽 static 聽Singleton & 聽Instance()聽{聽 // 聽Unique聽point聽of聽access 聽9 聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex); 10 聽聽聽聽聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 11 聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽 = 聽 new 聽Singleton(); 12 聽聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy);聽 // 聽Register聽Destroy聽function 13 聽聽聽聽聽聽聽聽聽} 14 聽聽聽聽聽聽聽聽聽 return 聽 * _instance; 15 聽聽聽聽聽} 16 聽聽聽聽聽 void 聽DoSomething(){} 17 聽private : 18 聽聽聽聽聽 static 聽 void 聽Destroy()聽{聽 // 聽Destroy聽the聽only聽instance 19 聽聽聽聽聽聽聽聽聽 if 聽(聽_instance聽 != 聽 0 聽)聽{ 20 聽聽聽聽聽聽聽聽聽聽聽聽聽delete聽_instance; 21 聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽 = 聽 0 ; 22 聽聽聽聽聽聽聽聽聽} 23 聽聽聽聽聽} 24 聽聽聽聽聽Singleton(){}聽 // 聽Prevent聽clients聽from聽creating聽a聽new聽Singleton 25 聽聽聽聽聽 ~ Singleton(){}聽 // 聽Prevent聽clients聽from聽deleting聽a聽Singleton 26 聽聽聽聽聽Singleton( const 聽Singleton & );聽 // 聽Prevent聽clients聽from聽copying聽a聽Singleton 27 聽聽聽聽聽Singleton & 聽operator = ( const 聽Singleton & ); 28 聽private : 29 聽聽聽聽聽 static 聽Mutex聽_mutex; 30 聽聽聽聽聽 static 聽Singleton聽 * _instance;聽 // 聽The聽one聽and聽only聽instance 31 聽}; 32 聽33 聽#endif /* SINGLETON_H */
singleton.cpp 1 聽#include聽 " singleton.h " 2 聽3 聽Mutex聽Singleton::_mutex; 4 聽Singleton * 聽Singleton::_instance聽 = 聽 0 ;
鐜板湪鐨凷ingleton铏界劧澶氱嚎紼嬪畨鍏紝鎬ц兘鍗村彈鍒頒簡褰卞搷銆備粠Instance()涓彲浠ョ湅鍒幫紝瀹為檯涓婁粎浠呭綋0 == _instance涓簍rue鏃舵墠闇瑕丩ock銆備綘寰堝鏄撳氨鍐欏嚭濡備笅浠g爜錛?br />1 聽static 聽Singleton & 聽Instance()聽{ 2 聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 3 聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex); 4 聽聽聽聽聽聽聽聽聽_instance聽 = 聽 new 聽Singleton(); 5 聽聽聽聽聽聽聽聽聽atexit(Destroy); 6 聽聽聽聽聽} 7 聽聽聽聽聽 return 聽 * _instance; 8 聽}
浣嗘槸榪欐牱榪樻槸浼氫駭鐢熺珵浜夋潯浠?race condition)錛屼竴縐嶅箍涓轟漢鐭ョ殑鍋氭硶鏄嬌鐢ㄦ墍璋撶殑Double-Checked Locking錛?br />聽1 聽static 聽Singleton & 聽Instance()聽{ 聽2 聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 聽3 聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex); 聽4 聽聽聽聽聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 聽5 聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽 = 聽 new 聽Singleton(); 聽6 聽聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy); 聽7 聽聽聽聽聽聽聽聽聽} 聽8 聽聽聽聽聽} 聽9 聽聽聽聽聽 return 聽 * _instance; 10 聽}
Double-Checked Locking 鏈哄埗鐪嬭搗鏉ュ儚鏄竴涓畬緹庣殑瑙e喅鏂規錛屼絾鏄湪鏌愪簺鏉′歡涓嬩粛鐒朵笉琛屻傜畝鍗曠殑璇達紝緙栬瘧鍣ㄤ負浜嗘晥鐜囧彲鑳戒細閲嶆帓鎸囦護鐨勬墽琛岄『搴?compiler-based reorderings )銆傜湅榪欎竴琛屼唬鐮侊細_instance聽= 聽 new 聽Singleton(); 鍦ㄧ紪璇戝櫒鏈紭鍖栫殑鎯呭喌涓嬮『搴忓涓嬶細1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱 2.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄錛?br />3.鍐呭瓨鍦板潃璧嬪肩粰_instance銆?/span> 浣嗘槸褰撶紪璇戝櫒浼樺寲鍚庢墽琛岄『搴忓彲鑳藉涓嬶細1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱 2.鍐呭瓨鍦板潃璧嬪肩粰_instance錛?br />3.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄銆?/span> 褰撶紪璇戝櫒浼樺寲鍚庯紝濡傛灉綰跨▼涓鎵ц鍒?鍚庤鎸傝搗銆傜嚎紼嬩簩寮濮嬫墽琛屽茍鍙戠幇0 == _instance涓篺alse錛屼簬鏄洿鎺eturn錛岃岃繖鏃禨ingleton瀵硅薄鍙兘榪樻湭鏋勯犲畬鎴愶紝鍚庢灉... 涓婇潰璇寸殑榪樺彧鏄崟澶勭悊鍣ㄧ殑鎯呭喌錛屽湪澶氬鐞嗗櫒(multiprocessors)鐨勬儏鍐典笅錛岃秴綰跨▼鎶鏈繀鐒朵細娣峰悎鎵ц鎸囦護錛屾寚浠ょ殑鎵ц欏哄簭鏇存棤娉曚繚闅溿傚叧浜?span style="COLOR: #333399">Double-Checked Locking 鐨勬洿璇︾粏鐨勬枃绔狅紝璇風湅錛?br />The "Double-Checked Locking is Broken" Declaration 5.浣跨敤volatile鍏抽敭瀛?br /> 涓轟簡璇存槑闂錛岃鍏堣冭檻濡備笅浠g爜錛?br />聽1 聽class 聽MyThread聽:聽 public 聽Thread聽{ 聽2 聽public : 聽3 聽聽聽聽聽virtual聽 void 聽run()聽{ 聽4 聽聽聽聽聽聽聽聽聽 while 聽( ! _stopped)聽{ 聽5 聽聽聽聽聽聽聽聽聽聽聽聽聽 // do聽something 聽6 聽聽聽聽聽聽聽聽聽} 聽7 聽聽聽聽聽} 聽8 聽聽聽聽聽 void 聽stop()聽{ 聽9 聽聽聽聽聽聽聽聽聽_stopped聽 = 聽 true ; 10 聽聽聽聽聽} 11 聽private : 12 聽聽聽聽聽bool聽_stopped; 13 聽}; 14 聽15 聽...16 聽17 聽MyThread聽thread; 18 聽thread.start();
涓婇潰鐢╰hread.start()寮鍚簡涓涓嚎紼嬶紝璇ョ嚎紼嬪湪while寰幆涓嫻媌ool鏍囪_stopped錛岀湅鏄惁璇ョ戶緇墽琛屻傚鏋滄兂瑕佺粨鏉熻繖涓嚎紼嬶紝璋冪敤thread.stop()搴旇娌¢棶棰樸備絾鏄渶瑕佹敞鎰忕殑鏄紪璇戝櫒寰堟湁鍙兘瀵筥stopped鐨勫瓨鍙栬繘琛屼紭鍖栥傚鏋滅紪璇戝櫒鍙戠幇_stopped琚綣佸瓨鍙?_stopped鍦╳hile寰幆涓?錛岀紪璇戝櫒鍙兘浼氳冭檻灝哶stopped緙撳瓨鍒板瘎瀛樺櫒涓紝浠ュ悗_stopped灝嗕細鐩存帴浠庡瘎瀛樺櫒瀛樺彇銆傝繖鏃跺欏鏋滄煇涓嚎紼嬭皟鐢ㄤ簡thread.stop()錛屽_stopped鐨勪慨鏀瑰皢涓嶄細鍙嶆槧鍒板瘎瀛樺櫒涓紝thread灝嗕細姘歌繙寰幆涓嬪幓... 涓轟簡闃叉緙栬瘧鍣ㄤ紭鍖栵紝鐢╲olatile鍏抽敭瀛楀氨OK浜嗭紝volatile璺焎onst鐨勭敤娉曞嚑涔庝竴鏍鳳紝鑳界敤const鐨勫湴鏂逛篃閮借兘鐢╲olatile銆傚Singleton鏉ヨ錛屼慨鏀瑰涓嬩袱澶勫嵆鍙細1 聽// singleton.h涓?/span> 2 聽static 聽Singleton聽 * _instance; 3 聽// 鏀逛負 4 聽static 聽Singleton聽 * 聽 volatile 聽_instance; 5 聽6 聽// singleton.cpp涓?/span> 7 聽Singleton * 聽Singleton::_instance聽 = 聽 0 ; 8 聽// 鏀逛負 9 聽Singleton * 聽 volatile 聽Singleton::_instance聽 = 聽 0 ;
6.灝哠ingleton娉涘寲涓烘ā鏉?br /> singleton.h 聽1 聽#ifndef聽SINGLETON_H 聽2 聽#define聽SINGLETON_H 聽3 聽聽4 聽#include聽 " synobj.h " 聽5 聽聽6 聽template < class 聽T > 聽7 聽class 聽Singleton聽{ 聽8 聽聽聽聽聽CLASS_UNCOPYABLE(Singleton) 聽9 聽public : 10 聽聽聽聽聽 static 聽T & 聽Instance()聽{聽 // 聽Unique聽point聽of聽access 11 聽聽聽聽聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 12 聽聽聽聽聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex); 13 聽聽聽聽聽聽聽聽聽聽聽聽聽 if 聽( 0 聽 == 聽_instance)聽{ 14 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽 = 聽 new 聽T(); 15 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy); 16 聽聽聽聽聽聽聽聽聽聽聽聽聽} 17 聽聽聽聽聽聽聽聽聽} 18 聽聽聽聽聽聽聽聽聽 return 聽 * _instance; 19 聽聽聽聽聽} 20 聽protected : 21 聽聽聽聽聽Singleton(){} 22 聽聽聽聽聽 ~ Singleton(){} 23 聽private : 24 聽聽聽聽聽 static 聽 void 聽Destroy()聽{聽 // 聽Destroy聽the聽only聽instance 25 聽聽聽聽聽聽聽聽聽 if 聽(聽_instance聽 != 聽 0 聽)聽{ 26 聽聽聽聽聽聽聽聽聽聽聽聽聽delete聽_instance; 27 聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽 = 聽 0 ; 28 聽聽聽聽聽聽聽聽聽} 29 聽聽聽聽聽} 30 聽聽聽聽聽 static 聽Mutex聽_mutex; 31 聽聽聽聽聽 static 聽T聽 * 聽 volatile 聽_instance;聽 // 聽The聽one聽and聽only聽instance 32 聽}; 33 聽34 聽template < class 聽T > 35 聽Mutex聽Singleton < T > ::_mutex; 36 聽37 聽template < class 聽T > 38 聽T聽 * 聽 volatile 聽Singleton < T > ::_instance聽 = 聽 0 ; 39 聽40 聽#endif /* SINGLETON_H */
嫻嬭瘯浠g爜錛?br />test.cpp 聽1 聽#include聽 " singleton.h " 聽2 聽聽3 聽class 聽A聽:聽 public 聽Singleton < A > 聽{ 聽4 聽聽聽聽聽friend聽 class 聽Singleton < A > ; 聽5 聽protected : 聽6 聽聽聽聽聽A(){} 聽7 聽聽聽聽聽 ~ A(){} 聽8 聽public : 聽9 聽聽聽聽聽 void 聽DoSomething(){} 10 聽}; 11 聽12 聽int 聽main()聽{ 13 聽14 聽聽聽聽聽A聽 & a聽 = 聽A::Instance(); 15 聽聽聽聽聽a.DoSomething(); 16 聽17 聽聽聽聽聽 return 聽 0 ; 18 聽}
7.Singleton鐨勬瀽鏋勯棶棰?/strong> 鍒版Singleton宸茬粡綆楁瘮杈冨畬鍠勪簡錛屼絾鏄緷鐒剁畻涓嶄笂瀹岀編錛屽洜涓哄埌鐜板湪鍙槸瑙e喅浜嗗綰跨▼闂錛屽姞鍏ヤ簡妯℃澘鏀寔錛屽浜?span style="COLOR: #333399">KDL problem(The Dead Reference Problem)
渚濈劧娌℃硶瑙e喅錛屽彲浠ヨ鍦ㄥ疄鐜癝ingleton妯″紡鏃訛紝鏈澶х殑闂灝辨槸澶氫釜鏈変緷璧栧叧緋葷殑Singleton鐨勬瀽鏋勯『搴?/span>銆傝櫧鐒?em style="COLOR: #333399">Modern C++ Design涓粰鍑轟簡瑙e喅鏂規錛屼絾鏄?span style="COLOR: #333399">Loki 鐨勫疄鐜板お榪囧鏉傦紝鍦ㄦ灝變笉璇︾粏璇存槑浜嗭紝鏈夊叴瓚g殑鍙互鐪嬬湅Modern C++ Design 錛屽綋鐒朵簡錛?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 GMT http://www.shnenglu.com/ant/archive/2007/09/07/31445.html http://www.shnenglu.com/ant/comments/31445.html http://www.shnenglu.com/ant/archive/2007/09/07/31445.html#Feedback 12 http://www.shnenglu.com/ant/comments/commentRss/31445.html http://www.shnenglu.com/ant/services/trackbacks/31445.html Singleton妯″紡鏄竴縐嶉潪甯哥畝鍗曠殑璁捐妯″紡錛岃繖縐嶆ā寮忓緢甯哥敤涔熷緢瀹規槗琚互鐢ㄣ傚綋浣犺璁″簲鐢ㄧ▼搴忕殑鏃跺欙紝緇忓父浼氶亣鍒版煇浜涘璞″湪鏁翠釜紼嬪簭鐨勭敓鍛藉懆鏈熷簲璇ヤ粎鏈変竴涓疄渚嬬殑鎯呭喌錛屾瘮濡?span style="COLOR: #333399">File System錛孏raphic System錛孡ogging Utility 錛岃繖鏃跺欏氨鍙互鐢ㄥ埌Singleton妯″紡銆係ingleton妯″紡鍦?span style="COLOR: #333399">GOF 涓弿榪板涓嬶細 Ensure a class only has one instance, and provide a global point of access to it. Singleton妯″紡鐨勫畾涔夊緢綆鍗曪紝瀹炵幇涔熸湁N澶氱錛屼絾鏄嵈寰堥毦鎵懼埌涓涓О寰椾笂“瀹岀編”鐨勩傚疄鐜頒竴涓畬緹庣殑Singleton姣旀兂璞′腑瑕侀毦鐨勫錛屼笅闈㈡帰绱㈡х殑鏉ュ疄鐜頒竴涓潪瀹岀編鐨勩?br>1.鍏稿瀷瀹炵幇 鍦–++涓紝Singleton妯″紡鐨勫吀鍨嬪疄鐜板涓嬶細
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閮戒負private涓斾粎鏈夊0鏄庢病鏈夊疄鐜幫紝紱佹浜嗗鎴蜂唬鐮佹嫹璐漇ingleton瀵硅薄銆傚敮涓鍙互鍒涘緩Singleton瀵硅薄鐨勬槸Singleton鑷繁鐨勯潤鎬佹垚鍛樺嚱鏁癐nstance錛岃繖鏍峰氨鍦ㄧ紪璇戝櫒淇濊瘉浜哠ingleton瀹炰緥鐨勫敮涓鎬с備笂闈㈣繖浜涙槸鍦–++涓疄鐜癝ingleton妯″紡鏈鍩烘湰鐨勮鐐廣?br> Instance鏂規硶淇濊瘉鍙湁鍦ㄧ涓嬈¤皟鐢ㄦ椂鎵嶄細鐢熸垚Singleton瀵硅薄錛屼互鍚庣殑璋冪敤鍙槸綆鍗曡繑鍥炲敮涓鐨勫凡瀛樺湪鐨勫疄渚嬨侷nstance鏂規硶瀹為檯涓婂疄鐜扮殑鏄?span style="COLOR: #333399">鎳掓儼鍒濆鍖?lazy initialize)錛?/em>濡傛灉紼嬪簭涓牴鏈病鏈夌敤鍒癝ingleton瀵硅薄錛屼篃灝辨牴鏈笉浼氫駭鐢烻ingleton鐨勫疄渚嬶紝榪欏湪Singleton瀵硅薄寰堝皯浣跨敤涓斿垱寤篠ingleton瀵硅薄寮閿姣旇緝澶х殑鎯呭喌涓嬬壒鍒湁鐢ㄣ?/p>
瀹㈡埛浠g爜鐜板湪鍙互榪欐牱浣跨敤Singleton錛?/p>
1 Singleton & s = Singleton::Instance(); 2 s.DoSomething();
榪橀渶瑕佽鏄庣殑鏄疭ingleton鐨勬瀽鏋勫嚱鏁幫紝鏋愭瀯鍑芥暟涔熶負private鍙互紱佹瀹㈡埛鍐欏嚭濡備笅浠g爜銆傚鏋滄煇涓鎴峰啓鍑轟簡濡備笅浠g爜錛岄殢鍚庣殑瀵筍ingleton鐨勮闂氨浼氬鑷翠負瀹氫箟琛屼負錛屽洜涓篠ingleton瀵硅薄宸茬粡涓嶅瓨鍦ㄣ?br>
1 Singleton * p = & Singleton::Instance(); 2 delete p;
2.寮曞叆smart pointer 涓婇潰鐨勫疄鐜扮畻鏄竴涓ソ鐨勫疄鐜板悧錛熷綋鐒朵笉鏄紝鎴栬榪炰竴涓紜殑瀹炵幇閮界畻涓嶄笂銆傚鏋滀綘鎯沖噾鍚堬紝褰撶劧娌¢棶棰橈紝涓婇潰鐨勪唬鐮佸ぇ澶氭暟鎯呭喌涓嬪彲浠ュ伐浣滅殑寰堝ソ銆備篃璁鎬綘宸茬粡娉ㄦ剰鍒頒簡涓浜涢棶棰橈紝姣斿璇村湪涓婇潰鐨勪唬鐮佷腑鍙湁new娌℃湁delete銆傛槸鐨勶紝浣犺浼氬彂鐢焟emory leak瀵瑰惂錛屽叾瀹瀖emory leak閮戒笉鏄富瑕佺殑闂錛屾墍鏈夌殑鐜頒唬鎿嶄綔緋葷粺鍦ㄨ繘紼嬬粨鏉熺殑鏃跺欓兘浼氬鍐呭瓨寰堝ソ鐨勮繘琛屽洖鏀躲傛瘮memory leak鏇村煎緱璁╀漢鎷呭咖鐨勬槸resource leak錛屽鏋淪ingleton鍦ㄦ瀯閫犲嚱鏁頒腑璇鋒眰浜嗘煇浜涜祫婧愶細緗戠粶榪炴帴錛屾枃浠跺彞鏌勶紝鏁版嵁搴撹繛鎺ョ瓑銆傝繖浜涜祫婧愬皢寰椾笉鍒伴噴鏀俱?br> 鍞竴淇resource leak鐨勬柟娉曞氨鏄湪紼嬪簭緇撴潫鐨勬椂鍊檇elete _instance銆傚綋鐒朵簡錛岀敤smart pointer鍐嶅ソ涓嶈繃錛屽湪榪欓噷鐢╝uto_ptr灝卞彲浠ユ弧瓚抽渶瑕佷簡(濡傛灉浣犺繕涓嶇煡閬搒mart_ptr鏄粈涔堬紝鑺辯偣鏃墮棿鐔熸倝C++鏍囧噯搴撳惂)錛屼慨鏀瑰悗鐨勪唬鐮佸涓嬶細
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鏍規湰鏃犳硶淇濊瘉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涓轟粈涔堣繕鏄笉琛岋紝璇瘋冭檻涓嬮潰鐨勬儏鍐碉細 NOTE錛氫笅闈㈢殑鎯呭喌鍦?em>Modern C++ Design
涓彨鍋?em style="COLOR: #333399">KDL(Keyboard,Display,Log)problem銆?br> 鏌愪釜紼嬪簭涓嬌鐢ㄤ簡濡備笅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鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍑虹幇閿欒鏃朵細璋冪敤Log 璁板綍閿欒淇℃伅錛屽茍涓旀瀯閫犲拰鏋愭瀯瀵艱嚧鐨勪換浣曢敊璇兘浼氱粓姝㈢▼搴忋?br> 鍦ㄧ▼搴忓惎鍔ㄦ椂錛屽鏋?span style="COLOR: #333399">Keyboard鏋勯犳垚鍔燂紝Display 鏋勯犲け璐ワ紝寰堟樉鐒跺湪Display 鐨勬瀯閫犲嚱鏁頒腑灝嗕細鏋勯?span style="COLOR: #333399">Log鑰屼笖澶辮觸淇℃伅浼氳Log 璁板綍錛屾牴鎹亣璁捐繖鏃跺欑▼搴忓噯澶囬鍑猴紝atexit娉ㄥ唽鐨勫嚱鏁板皢浼氭寜LIFO鐨勯『搴忚璋冪敤銆傚洜涓?span style="COLOR: #333399">Keyboard鍏堜簬Log 鏋勯狅紝鎵浠?span style="COLOR: #333399">Log鍏堜簬Keyboard 鏋愭瀯錛屼絾鏄綋鐢變簬鏌愮鍘熷洜Keyboard 鍦ㄦ瀽鏋勬椂澶辮觸錛屾兂瑕佽皟鐢?span style="COLOR: #333399">Log璁板綍閿欒淇℃伅鏃訛紝Log 鏃╁凡琚攢姣侊紝鍒橪og::Instance()灝嗕細瀵艱嚧鏈畾涔夎涓恒?br>
#atexit鐨勪弗閲嶉棶棰橈細 浠庝笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭錛宎texit鍜宻mart pointer鐩告瘮浠呬粎鏄湁LIFO鐨勪繚璇佽屽凡錛岃繖鏍風殑淇濊瘉璨屼技涔熶笉鎬庝箞鏈夋晥錛屽洜涓篴texit璺焥mart pointer涓鏍蜂篃鏃犳硶瑙e喅KDL probleam 銆?br> atexit鐢變簬LIFO甯︽潵浜嗗彟澶栫殑闂錛岀湅涓嬮潰鐨勪唬鐮侊細
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娉ㄥ唽浜咶oo錛孎oo璋冪敤浜唖td::atexit(Bar)銆傚綋紼嬪簭閫鍑烘椂錛屾牴鎹產texit鐨凩IFO淇濊瘉錛孊ar鍦‵oo涔嬪悗娉ㄥ唽錛屽洜姝ar搴旇鍦‵oo涔嬪墠璋冪敤錛屼絾鏄綋Bar娉ㄥ唽鐨勬椂鍊橣oo宸茬粡璋冪敤浜嗭紝Bar鏍規湰灝辨病鏈夋満浼氳兘澶熷湪Foo涔嬪墠璋冪敤銆傝繖鏄庢樉鑷浉鐭涚浘瀵瑰惂錛屾病鍔炴硶錛孋++鏍囧噯濂藉儚蹇借浜嗚繖涓鐐癸紝鍥犳濡傛灉綾諱技浠g爜琚皟鐢紝鑲畾涓嶄細鏈変粈涔堝ソ鐨勭粨鏋滐紝濂戒竴鐐規槸resource leak錛屽樊涓鐐逛及璁$▼搴忓氨宕╂簝浜嗭紒錛侊紒 atexit鐨勮繖涓棶棰樿窡Singleton鏈夊叧緋誨悧錛熷綋鐒舵湁錛屽鏋滃湪涓涓猄ingleton鐨勬瀽鏋勫嚱鏁頒腑璋冪敤atexit灝變細鍑虹幇涓婅堪闂銆傚嵆鍦?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鍦ㄦ瀽鏋勫嚱鏁頒腑浼氭瀯閫?span style="COLOR: #333399">Log錛?span style="COLOR: #333399">Log鐨勬瀯閫犲嚱鏁頒細闂存帴璋冪敤atexit銆俹ops!!!錛屽彲鎬曠殑鏈畾涔夎涓恒?br> 鐪嬪埌榪欓噷浣犱竴瀹氬atexit鐩稿綋澶辨湜錛岃矊浼煎畠甯︽潵鐨勫ソ澶勫浜庡潖澶勩備絾鏄浣犵浉淇★紝濡傛灉閫傚綋璁捐錛宎texit鍦ㄥ悗闈㈢殑Singleton鏀歸犱腑浼氳搗鍒板緢閲嶈鐨勪綔鐢ㄣ?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()灝嗕細鍒涘緩涓涓柊鐨?span style="COLOR: #333399">Log瀵硅薄錛岀▼搴忓皢浼氳〃鐜拌壇濂姐傚綋鐒朵簡錛?span style="COLOR: #993366">Phoenix Singleton浠呰兘鐢ㄤ簬鏃犵姸鎬佺殑Singleton錛屽鏋?span style="COLOR: #333399">Log闇瑕佷繚瀛樻煇浜涚姸鎬侊紝Phoenix Singleton 涔熶笉浼氬甫鏉ヤ換浣曞ソ澶勩備綘褰撶劧鍙互鐢ㄦ煇浜涙柟娉曠淮鎸?span style="COLOR: #993366">Phoenix Singleton鐨勭姸鎬侊紝浣嗘槸鍦ㄥ仛涔嬪墠鍏堟兂鎯崇湅鏄惁鍊煎緱錛岀淮鎸佺姸鎬佸彲鑳戒細浣縎ingleton鍙樺緱鐗瑰埆澶嶆潅銆?br> 涓婇潰鐨?span style="COLOR: #993366">Phoenix Singleton宸茬粡鍙互婊¤凍澶ч儴鍒嗛渶瑕侊紝濡傛灉浣犵殑Singleton娌℃湁娑夊強鍒板綰跨▼錛屽涓猄ingleton涔嬮棿涔熸病鏈変緷璧栧叧緋伙紝浣犲ぇ鍙互鏀懼績浣跨敤銆備絾鏄鏋滀綘鐢ㄥ埌澶氱嚎紼嬶紝鎴栬呬綘鐨凷ingleton鍏崇郴濡?span style="COLOR: #333399">KDL 鑸鏉傦紝鎴栬呬綘瑙夊緱瀵規瘡涓涓猄ingleton閮芥暡鍚屾牱鐨勪唬鐮佽浣犲帉鐑︺傚湪鍚庨潰鍑犵瘒浼氭湁涓涓?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 GMT http://www.shnenglu.com/ant/archive/2007/08/31/31280.html http://www.shnenglu.com/ant/comments/31280.html http://www.shnenglu.com/ant/archive/2007/08/31/31280.html#Feedback 7 http://www.shnenglu.com/ant/comments/commentRss/31280.html http://www.shnenglu.com/ant/services/trackbacks/31280.html (functor 聽and function object )浣滀負鏋勯犲嚱鏁板弬鏁般傚鏋滀綘鐔熸倝STL錛屼綘搴旇鐔熸倝bind1st鍜宐ind2nd榪欎袱涓嚱鏁伴厤鎺ュ櫒(function adapter )錛宐ind1st鍜宐ind2nd鍙互灝嗕竴涓簩鍏冨嚱鏁?binary function )杞崲鎴愪竴鍏冨嚱鏁?unary function )銆備負浜嗕嬌Thread綾昏兘澶熺敤鏅氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負鍙傛暟錛屾垜浠渶瑕佷竴涓猙ind灝嗕竴鍏冨嚱鏁拌漿鎹㈡垚鏃犲弬鍑芥暟錛?br />bind.h 聽1 聽#ifndef聽BIND_H 聽2 聽#define聽BIND_H 聽3 聽聽4 聽template聽 < class 聽_Result > 聽5 聽struct聽trivial_function聽{ 聽6 聽聽聽聽聽typedef聽_Result聽result_type; 聽7 聽}; 聽8 聽聽9 聽template聽 < class 聽_Operation > 10 聽class 聽binder聽:聽 public 聽trivial_function < typename聽_Operation::result_type > 聽{ 11 聽public : 12 聽聽聽聽聽binder( const 聽_Operation & x,聽 const 聽typename聽_Operation::argument_type & y) 13 聽聽聽聽聽聽聽聽聽:op(x),聽value(y)聽{} 14 聽聽聽聽聽typename聽_Operation::result_type聽operator()()聽 const 聽{ 15 聽聽聽聽聽聽聽聽聽 return 聽op(value); 16 聽聽聽聽聽} 17 聽protected : 18 聽聽聽聽聽_Operation聽op; 19 聽聽聽聽聽typename聽_Operation::argument_type聽value; 20 聽}; 21 聽22 聽template聽 < class 聽_Operation,聽 class 聽_Tp > 23 聽inline聽binder < _Operation > 聽 24 聽bind( const 聽_Operation & 聽__fn,聽 const 聽_Tp & 聽__x)聽 25 聽{ 26 聽聽聽聽聽typedef聽typename聽_Operation::argument_type聽_Arg_type; 27 聽聽聽聽聽 return 聽binder < _Operation > (__fn,聽_Arg_type(__x)); 28 聽} 29 聽30 聽#endif /* BIND_H */
鏈変簡bind鎴戜滑榪橀渶瑕佷慨鏀筎hread綾葷殑鏋勯犲嚱鏁幫紝鏄劇劧鎴戜滑蹇呴』灝嗘瀯閫犲嚱鏁板0鏄庝負鎴愬憳妯℃澘(榪樻湁涓縐嶆柟娉曚篃鍙互杈懼埌鍚屾牱鐨勭洰鐨勶紝灝辨槸鎶奣hread綾誨0鏄庝負妯℃澘錛屼絾鏄繖鏍風殑璁捐濂藉儚涓嶅お濂?錛岃繖鏍鋒墠鑳藉璁㏕hread綾葷殑鏋勯犲嚱鏁板彲浠ユ帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼慨鏀瑰悗鐨勬瀯閫犲嚱鏁板簲璇ヨ兘澶熶嬌鐢ㄥ涓嬩笁縐嶇被鍨嬬殑鍙傛暟錛?br />1.Runnable * 2.no argument function 3.no argument functor 涓嬮潰鏄慨鏀瑰悗鐨勫ご鏂囦歡錛?br />runnable.h 聽1 聽#ifndef聽RUNNABLE_H 聽2 聽#define聽RUNNABLE_H 聽3 聽聽4 聽struct聽Runnable聽{ 聽5 聽聽聽聽聽virtual聽 void 聽run()聽 = 聽 0 ; 聽6 聽聽聽聽聽virtual聽 ~ Runnable()聽{} 聽7 聽}; 聽8 聽聽9 聽template聽 < class 聽T > 10 聽class 聽RunnableFunctor聽:聽 public 聽Runnable聽{ 11 聽public : 12 聽聽聽聽聽RunnableFunctor( const 聽T & f)聽:_func(f)聽{} 13 聽聽聽聽聽virtual聽 void 聽run()聽{聽_func();聽} 14 聽private : 15 聽聽聽聽聽T聽_func; 16 聽}; 17 聽18 聽// base聽template聽for聽no聽argument聽functor 19 聽template聽 < class 聽T > 20 聽struct聽FuncImpl聽{ 21 聽聽聽聽聽 static 聽Runnable * 聽transfer( const 聽T & t)聽{ 22 聽聽聽聽聽聽聽聽聽 return 聽 new 聽RunnableFunctor < T > (t); 23 聽聽聽聽聽} 24 聽}; 25 聽26 聽// partial聽specialization聽for聽T* 27 聽template聽 < class 聽T > 28 聽struct聽FuncImpl < T *> 聽{ 29 聽聽聽聽聽 static 聽Runnable * 聽transfer(T * t)聽{ 30 聽聽聽聽聽聽聽聽聽 return 聽t; 31 聽聽聽聽聽} 32 聽}; 33 聽34 聽// partial聽specialization聽for聽no聽argument聽function 35 聽template聽 < class 聽T > 36 聽struct聽FuncImpl < T聽( * )() > 聽{ 37 聽聽聽聽聽 static 聽Runnable * 聽transfer(T聽( * t)())聽{ 38 聽聽聽聽聽聽聽聽聽 return 聽 new 聽RunnableFunctor < T聽( * )() > (t); 39 聽聽聽聽聽} 40 聽}; 41 聽42 聽template聽 < class 聽T > 43 聽inline聽Runnable * 聽transfer( const 聽T & t)聽{ 44 聽聽聽聽聽 return 聽FuncImpl < T > ::transfer(t); 45 聽} 46 聽47 聽#endif /* RUNNABLE_H */
thread.h 聽1 聽#ifndef聽THREAD_H 聽2 聽#define聽THREAD_H 聽3 聽聽4 聽#include聽 < windows.h > 聽5 聽#include聽 " bind.h " 聽6 聽#include聽 " runnable.h " 聽7 聽聽8 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 聽9 聽聽聽聽聽 private :聽\ 10 聽聽聽聽聽classname( const 聽classname & );聽\ 11 聽聽聽聽聽classname & 聽operator = ( const 聽classname & ); 12 聽13 聽class 聽Thread聽:聽 public 聽Runnable聽{ 14 聽聽聽聽聽CLASS_UNCOPYABLE(Thread) 15 聽public : 16 聽聽聽聽聽Thread() 17 聽聽聽聽聽聽聽聽聽:_target( 0 ) 18 聽聽聽聽聽聽聽聽聽,_handle( 0 )聽{ 19 聽20 聽聽聽聽聽} 21 聽聽聽聽聽template聽 < class 聽T > 22 聽聽聽聽聽explicit聽Thread( const 聽T & op) 23 聽聽聽聽聽聽聽聽聽:_target(transfer(op)) 24 聽聽聽聽聽聽聽聽聽,_handle( 0 )聽{ 25 聽26 聽聽聽聽聽} 27 聽聽聽聽聽virtual聽 ~ Thread(); 28 聽聽聽聽聽virtual聽 void 聽run()聽{} 29 聽聽聽聽聽 void 聽start(); 30 聽聽聽聽聽 void 聽join(); 31 聽private : 32 聽聽聽聽聽 static 聽unsigned聽__stdcall聽threadProc( void * param); 33 聽private : 34 聽聽聽聽聽Runnable * _target; 35 聽聽聽聽聽HANDLE聽_handle; 36 聽}; 37 聽38 聽#endif /* THREAD_H */
thread.cpp鍜屽墠涓綃囩殑鍑犱箮涓鏍鳳紝鍞竴鐨勪笉鍚屾槸鍘繪帀浜嗘瀯閫犲嚱鏁癟hread(Runnable *)錛屽洜涓虹幇鍦ㄧ殑鏋勯犲嚱鏁版敼鎴愪簡鎴愬憳妯℃澘錛屽疄鐜頒篃鏀懼湪thread.h涓簡銆傜幇鍦ㄧ殑鏋勯犲嚱鏁拌兘澶熸帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼富瑕佸綊鍔熶簬妯℃澘鍑芥暟transfer錛屽疄鐜頒唬鐮佸湪runnable.h涓紝涓昏鎶宸ф槸鐢ㄧ被鐨勫亸鐗瑰寲妯℃嫙鍑芥暟妯℃澘鐨勫亸鐗瑰寲錛屼笉鏄庣櫧鐨勮鐪?a id="_117bf2a46b69_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl" href="/ant/archive/2007/08/30/31201.html">涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/a>銆?br /> 涓嬮潰鏄祴璇曚唬鐮侊細test.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < iostream > 聽3 聽#include聽 < functional > 聽4 聽聽5 聽using聽namespace聽std; 聽6 聽聽7 聽// no聽argument聽function 聽8 聽void 聽print()聽{ 聽9 聽聽聽聽聽cout聽 << 聽 " print " 聽 << 聽endl; 10 聽} 11 聽12 聽// unary聽function 13 聽void 聽print1( int 聽n)聽{ 14 聽聽聽聽聽cout聽 << 聽 " print1 " 聽 << 聽endl; 15 聽} 16 聽17 聽// binary聽function 18 聽void 聽print2( int 聽m,聽 int 聽n)聽{ 19 聽聽聽聽聽cout聽 << 聽 " print2 " 聽 << 聽endl; 20 聽} 21 聽22 聽23 聽// no聽argument聽functor 24 聽struct聽PrintFunctor聽{ 25 聽聽聽聽聽 void 聽operator()()聽 const 聽{ 26 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor " 聽 << 聽endl; 27 聽聽聽聽聽} 28 聽}; 29 聽30 聽// unary聽functor 31 聽struct聽PrintFunctor1聽:聽 public 聽unary_function < int ,聽 void > 聽{ 32 聽聽聽聽聽 void 聽operator()( int 聽n)聽 const 聽{ 33 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor1 " 聽 << 聽endl; 34 聽聽聽聽聽} 35 聽}; 36 聽37 聽// binary聽functor 38 聽struct聽PrintFunctor2聽:聽 public 聽binary_function < int ,聽 int ,聽 void > 聽{ 39 聽聽聽聽聽 void 聽operator()( int 聽m,聽 int 聽n)聽 const 聽{ 40 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor2 " 聽 << 聽endl; 41 聽聽聽聽聽} 42 聽}; 43 聽44 聽int 聽main()聽{ 45 聽46 聽聽聽聽聽 // construct聽Thread聽with聽no聽argument聽function 47 聽聽聽聽聽Thread聽thread1( & print); 48 聽聽聽聽聽thread1.start(); 49 聽50 聽聽聽聽聽 // construct聽Thread聽with聽unary聽function 51 聽聽聽聽聽Thread聽thread2(bind(ptr_fun(print1),聽 5 )); 52 聽聽聽聽聽thread2.start(); 53 聽54 聽聽聽聽聽 // construct聽Thread聽with聽binary聽function 55 聽聽聽聽聽Thread聽thread3(bind(bind1st(ptr_fun(print2),聽 1 ),聽 2 )); 56 聽聽聽聽聽thread3.start(); 57 聽58 聽59 聽聽聽聽聽 // construct聽Thread聽with聽no聽argument聽functor 60 聽聽聽聽聽Thread聽thread4((PrintFunctor())); 61 聽聽聽聽聽thread4.start(); 62 聽63 聽聽聽聽聽 // construct聽Thread聽with聽unary聽functor 64 聽聽聽聽聽Thread聽thread5(bind(PrintFunctor1(),聽 5 )); 65 聽聽聽聽聽thread5.start(); 66 聽67 聽聽聽聽聽 // construct聽Thread聽with聽binary聽functor 68 聽聽聽聽聽Thread聽thread6(bind(bind1st(PrintFunctor2(),聽 1 ),聽 2 )); 69 聽聽聽聽聽thread6.start(); 70 聽71 聽聽聽聽聽thread1.join(); 72 聽聽聽聽聽thread2.join(); 73 聽聽聽聽聽thread3.join(); 74 聽聽聽聽聽thread4.join(); 75 聽聽聽聽聽thread5.join(); 76 聽聽聽聽聽thread6.join(); 77 聽78 聽聽聽聽聽 return 聽 0 ; 79 聽}
褰撶劧浜嗭紝涓婇潰鐨勫茍涓嶆槸鍏ㄩ儴錛屼慨鏀瑰悗鐨凾hread綾諱笉浠呰兘澶熶嬌鐢ㄥ師鍏堢殑浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛鐨勬柟娉曪紝榪樺彲浠ヤ嬌鐢ㄤ換浣曟棤鍙傚嚱鏁版垨鏃犲弬鍑芥暟瀵硅薄銆傞櫎浜唗est.cpp閲岀ず鑼冪殑錛屼綘鐢氳嚦鍙互鐢╞ind,bind1st,bind2st,mem_fun,mem_fun_ref鐨勭粍鍚堟潵鐢ㄦ煇涓被鐨勬垚鍛樺嚱鏁頒綔涓哄弬鏁幫紝鍏鋒湁瓚呭己鐨勭伒媧繪с?br /> 鐩墠瀹炵幇鐨勮繖浜涢兘鏄疶hread綾繪渶鍩烘湰鐨勫姛鑳斤紝鍏朵粬鍔熻兘濡傝緗嚎紼嬩紭鍏堢駭錛屾寕璧鋒垨鎭㈠綰跨▼錛屽紓甯稿鐞嗙瓑鍏蜂綋瀹炵幇閮芥瘮杈冪畝鍗曪紝榪欒繖閲屽氨涓嶄竴涓瀹炵幇浜嗐? 婧愪唬鐮佷笅杞斤細鐐瑰嚮涓嬭澆 ]]> C++&Win32鍐欑殑絀哄綋鎺ラ緳 http://www.shnenglu.com/ant/archive/2007/08/30/31234.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 13:37:00 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31234.html http://www.shnenglu.com/ant/comments/31234.html http://www.shnenglu.com/ant/archive/2007/08/30/31234.html#Feedback 19 http://www.shnenglu.com/ant/comments/commentRss/31234.html http://www.shnenglu.com/ant/services/trackbacks/31234.html 絀哄綋鎺ラ緳 娓告垙錛屽啓浜嗕竴涓ぜ鎷滐紝瀹屽叏浠縲indows鐨勫懙鍛點?br>涓嶈繃涔熶笉鍏ㄤ竴鏍鳳紝鏈変竴浜涚粏鑺備竴鐩存病鏈夋椂闂村紕錛屾病鍔炴硶鏈榪戞瘮杈冩噿... 涓巜indows涓嬬殑鐩告瘮錛屾垜鍋氱殑榪欎釜鍔犲叆浜?span style="COLOR: #993300">AI (蹇嵎閿瓼6)錛屽彲浠ュ紑鍚?span style="COLOR: #993300">縐葷墝鎻愮ず (蹇嵎閿瓼7)錛屼笉榪?span style="COLOR: #993300">鎾ら攢 涓鐩存病鏈夊仛錛屽彲鑳藉摢澶╃獊鐒舵兂鍋氫簡浼氬姞涓婂幓銆傚彟澶栨敼榪涗簡搴熺墝鍥炴敹綆楁硶 錛岄潪娉曠Щ鐗岀殑鎻愮ず鐩存帴鍘繪帀浜嗭紝榪樻湁涓浜涘皬鐨勭粏鑺備綔浜嗘敼榪涖?br>鎰熷叴瓚g殑鍙互涓嬭澆錛?a title=鐐瑰嚮涓嬭澆 href="http://www.shnenglu.com/Files/ant/Freecell.rar">鐐瑰嚮涓嬭澆 婧愪唬鐮佷笅杞斤細鐐瑰嚮涓嬭澆 欏轟究鍙戝嚑寮犳埅鍥撅細
]]> 涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/title> http://www.shnenglu.com/ant/archive/2007/08/30/31201.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 05:55:00 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31201.html http://www.shnenglu.com/ant/comments/31201.html http://www.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback 4 http://www.shnenglu.com/ant/comments/commentRss/31201.html http://www.shnenglu.com/ant/services/trackbacks/31201.html
Overloading vs. Specialization
鍦–++涓湁class templates 鍜?em>function templates錛岃繖涓ょ妯$増鏈夊緢澶氬尯鍒紝鏈閲嶈鐨勫尯鍒氨鏄噸杞?overloading)錛?br />鏅氱殑C++綾諱笉鑳介噸杞斤紝褰撶劧綾繪ā鐗堜篃涓嶈兘閲嶈澆錛涚浉鍙嶏紝鏅氬嚱鏁板彲浠ラ噸杞斤紝鍑芥暟妯$増涔熻兘閲嶈澆銆傝繖鍐嶆甯鎬笉榪囷紝鐪嬩笅闈㈢殑浠g爜錛?/p>
聽1 聽//
聽Example聽1:聽Class聽vs.聽function聽template,聽and聽overloading聽
聽2 聽//
聽3 聽
聽4 聽// 聽A聽class聽template
聽5 聽template < class 聽T > 聽 class 聽X聽{聽 /*... */ 聽};聽聽聽聽聽聽 //
聽(a)
聽6 聽
聽7 聽// 聽A聽function聽template聽with聽two聽overloads
聽8 聽template < class 聽T > 聽 void 聽f(聽T聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽(b)
聽9 聽template < class 聽T > 聽 void 聽f(聽 int ,聽T,聽 double 聽);聽 //
聽(c)
10 聽
鍍忎笂闈㈡湭鐗瑰寲鐨勬ā鏉塊氬父鍙仛base templates 銆傚綋鐒訛紝base templates 鑳藉琚壒鍖栵紝鍦ㄧ壒鍖栬繖涓鐐逛笂class templates 鍜?em>function templates鏈夊緢澶х殑鍖哄埆錛氫竴涓?em>class template 鑳藉琚?em>partially specialized and/or fully specialized 錛屼竴涓?em>function template鍙兘琚?em>fully specialized錛屼絾鏄敱浜?em>function templates鑳藉閲嶈澆鎴戜滑鍙互閫氳繃閲嶈澆鏉ュ疄鐜板拰partially specialized 鐩稿綋鐨勫姛鑳姐備笅闈㈢殑浠g爜璇存槑浜嗚繖浜涘尯鍒細
聽1 聽//
聽Example聽1,聽continued:聽Specializing聽templates聽
聽2 聽//
聽3 聽
聽4 聽// 聽A聽partial聽specialization聽of聽(a)聽for聽pointer聽types聽
聽5 聽template < class 聽T > 聽 class 聽X < T *> 聽{聽 /*... */
聽};
聽6 聽
聽7 聽// 聽A聽full聽specialization聽of聽(a)聽for聽int聽
聽8 聽template <> 聽 class 聽X < int > 聽{聽 /*... */
聽};
聽9 聽
10 聽//
聽A聽separate聽base聽template聽that聽overloads聽(b)聽and聽(c)聽
11 聽//
聽--聽NOT聽a聽partial聽specialization聽of聽(b),聽because聽
12 聽//
聽there's聽no聽such聽thing聽as聽a聽partial聽specialization聽
13 聽// 聽of聽a聽function聽template!聽
14 聽template < class 聽T > 聽 void 聽f(聽T * 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(d)
15 聽
16 聽// 聽A聽full聽specialization聽of聽(b)聽for聽int聽
17 聽template <> 聽 void 聽f < int > (聽 int 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(e)
18 聽
19 聽//
聽A聽plain聽old聽function聽that聽happens聽to聽overload聽with聽
20 聽//
聽(b),聽(c),聽and聽(d)聽--聽but聽not聽(e),聽which聽we'll聽
21 聽// 聽discuss聽in聽a聽moment聽
22 聽void 聽f(聽 double 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(f)
23 聽
鏍規嵁鍑芥暟閲嶈澆瑙f瀽瑙勫垯錛?/p>
聽1 聽//
聽Example聽1,聽continued:聽Overload聽resolution聽
聽2 聽// 聽
聽3 聽
bool聽b;聽
聽4 聽int
聽i;聽
聽5 聽double
聽d;
聽6 聽
聽7 聽f(聽b聽);聽聽聽聽聽聽聽聽 // 聽calls聽(b)聽with聽T聽=聽bool聽
聽8 聽f(聽i,聽 42 ,聽d聽);聽 // 聽calls聽(c)聽with聽T聽=聽int聽
聽9 聽f(聽 & i聽);聽聽聽聽聽聽聽 // 聽calls聽(d)聽with聽T聽=聽int聽
10 聽f(聽i聽);聽聽聽聽聽聽聽聽 // 聽calls聽(e)聽
11 聽f(聽d聽);聽聽聽聽聽聽聽聽 // 聽calls聽(f)
涓婇潰璇寸殑榪欎簺鍏跺疄閮芥槸寰堢畝鍗曠殑鎯呭喌錛屽ぇ澶氭暟浜哄緢瀹規槗灝辮兘鏄庣櫧錛屼笅闈㈢殑鎵嶆槸瀹規槗璁╀漢寮勬販鐨勶細 1.鑰冭檻濡備笅浠g爜錛?/p>
聽1 聽//
聽Example聽2:聽Explicit聽specialization聽
聽2 聽// 聽
聽3 聽template < class 聽T > 聽 // 聽(a)聽a聽base聽template聽
聽4 聽void
聽f(聽T聽);
聽5 聽
聽6 聽template < class 聽T > 聽 // 聽(b)聽a聽second聽base聽template,聽overloads聽(a)聽
聽7 聽void 聽f(聽T * 聽);聽聽聽聽聽 //
聽聽聽聽聽(function聽templates聽can't聽be聽partially聽
聽8 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽聽聽聽聽specialized;聽they聽overload聽instead)
聽9 聽
10 聽template <> 聽聽聽聽聽聽聽聽 // 聽(c)聽explicit聽specialization聽of聽(b)聽
11 聽void 聽f <> ( int *
);
12 聽
13 聽// 聽...
14 聽
15 聽int 聽 *
p;聽
16 聽f(聽p聽);聽聽聽聽聽聽聽聽聽聽聽 // 聽calls聽(c)
鏈鍚庝竴琛岀殑緇撴灉鍍忓ぇ澶氭暟浜烘墍鏈熸湜鐨勪竴鏍鳳紝闂鏄細涓轟粈涔堟湡鏈涙槸榪欎釜緇撴灉錛?br />濡傛灉浣犳湡鏈涚殑鍘熷洜鏄敊璇殑錛屾帴涓嬫潵鐨勪竴瀹氫細璁╀綘濂藉銆備篃璁鎬綘浼氳錛?鎴戜負int* 鍐欎簡涓涓壒鍖栫増鏈紝f(p) 褰撶劧浼氳皟鐢?span style="COLOR: #3366ff">c"錛屼笉騫哥殑鏄紝榪欐鏄敊璇殑鍘熷洜!!! 2.鍐嶈冭檻涓嬮潰鐨勪唬鐮侊細
聽1 聽//
聽Example聽3
聽2 聽// 聽
聽3 聽template < class 聽T > 聽 // 聽(a)聽same聽old聽base聽template聽as聽before聽
聽4 聽void
聽f(聽T聽);
聽5 聽
聽6 聽template <> 聽聽聽聽聽聽聽聽 // 聽(c)聽explicit聽specialization,聽this聽time聽of聽(a)
聽7 聽void 聽f <> ( int *
);
聽8 聽
聽9 聽template < class 聽T > 聽 // 聽(b)聽a聽second聽base聽template,聽overloads聽(a)聽
10 聽void 聽f(聽T *
聽);
11 聽
12 聽// 聽...
13 聽
14 聽int 聽 *
p;聽
15 聽f(聽p聽);聽聽聽聽聽聽聽聽聽聽聽 //
聽calls聽(b)!聽overload聽resolution聽ignores聽
16 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽specializations聽and聽operates聽on聽the聽base聽
17 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽function聽templates聽only
濡傛灉榪欎釜緇撴灉璁╀綘鎰熷埌鎯婂錛岄偅灝卞浜嗭紒寰堝浜洪兘浼氭劅鍒版儕濂囷紒 鐞嗚В榪欎釜鐨勫叧閿槸錛?em style="COLOR: #993300">Specializations don't overload,only the base templates overload. 閲嶈澆瑙f瀽浠呬粎閫夋嫨base template(鎴栬卬ontemplate function錛屽鏋滄湁鐨勮瘽)錛屽彧鏈夊綋緙栬瘧鍣ㄥ凡緇忓喅瀹氫簡鍝釜 base template灝嗕細琚夋嫨錛岀紪璇戝櫒鎵嶄細緇х畫寰涓嬪鎵鵑傚悎鐨勭壒鍖栫増鏈紝濡傛灉鎵懼埌浜嗗氨浣跨敤閭d釜鐗瑰寲鐗堟湰銆?br /> 鏈鍚庯紝搴斿綋閬垮厤鐗瑰寲鍑芥暟妯℃澘錛屼篃瑕侀伩鍏嶉噸杞藉嚱鏁版ā鏉?nontemplate function鐨勯噸杞藉綋鐒舵病闂)銆傚鏋滀竴瀹氳榪欐牱錛屽彲浠ヤ嬌鐢ㄥ涓嬫柟娉曟ā鎷熷嚱鏁版ā鏉跨殑鍋忕壒鍖栵細
聽1 聽// base聽template聽class,聽
聽2 聽template聽 < class 聽T >
聽3 聽
struct聽FuncImpl聽{
聽4 聽聽聽聽聽 // users,聽go聽ahead聽and聽specialize聽this
聽5 聽聽聽聽聽 static 聽 int 聽apply( const 聽T聽 &
t)聽{
聽6 聽聽聽聽聽聽聽聽聽 return 聽 0
;
聽7 聽
聽聽聽聽}
聽8 聽
};
聽9 聽
10 聽// partial聽specialazation聽for聽int
11 聽template聽 <>
12 聽struct聽FuncImpl < int >
聽{
13 聽聽聽聽聽 static 聽 int 聽apply( int
聽t)聽{
14 聽聽聽聽聽聽聽聽聽 return 聽 1
;
15 聽
聽聽聽聽}
16 聽
};
17 聽
18 聽// partial聽specialazation聽for聽T*
19 聽template聽 < class 聽T >
20 聽聽聽聽聽struct聽FuncImpl < T聽 *>
聽{
21 聽聽聽聽聽 static 聽 int 聽apply(T聽 *
t)聽{
22 聽聽聽聽聽聽聽聽聽 return 聽 2
;
23 聽
聽聽聽聽}
24 聽
};
25 聽
26 聽// users,聽don't聽touch聽this!
27 聽template聽 < class 聽T >
28 聽int 聽func( const 聽T聽 &
t)聽{
29 聽聽聽聽聽 return 聽FuncImpl < T >
::apply(t);
30 聽
}
31 聽
32 聽int 聽i聽 = 聽 10
,聽r;
33 聽r聽 = 聽func( ' c ' );聽 // r聽=聽0
34 聽r聽 = 聽func( 8 );聽 // r聽=聽1
35 聽r聽 = 聽func( & i);聽 // r聽=聽2
]]> 浠嶹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 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31190.html http://www.shnenglu.com/ant/comments/31190.html http://www.shnenglu.com/ant/archive/2007/08/30/31190.html#Feedback 8 http://www.shnenglu.com/ant/comments/commentRss/31190.html http://www.shnenglu.com/ant/services/trackbacks/31190.html 鍓嶅嚑澶╁湪瀛indows澶氱嚎紼嬬▼搴忚璁★紝鍙戠幇Win32 API鐢ㄨ搗鏉ョ‘瀹炰笉鎬庝箞鏂逛究錛岀壒鍒槸瀵逛簬C++紼嬪簭鍛樸備簬鏄疄鐜頒簡涓涓畝鍗曠殑灝佽錛屾妧鏈惈閲忓綋鐒朵笉楂橈紝涓嶈繃鐢ㄨ搗鏉ヨ繕鏄瘮杈冩柟渚跨殑銆傚鏋滀綘鐔熸倝Java錛屼綘浼氬彂鐜拌繖涓疄鐜版湁鐐瑰儚Java鐨凾hread錛屽湪Java涓湁涓ょ鏂規硶鍙互鍒涘緩涓涓猅hread錛?br /> 1.浠嶵hread綾葷戶鎵垮茍瀹炵幇run鏂規硶錛?/p>
1 聽class 聽MyThread聽 extends
聽Thread聽{
2 聽聽聽聽聽 public 聽 void
聽run()聽{
3 聽
聽聽聽聽聽聽聽聽...
4 聽
聽聽聽聽}聽
5 聽
};
6 聽
7 聽// 寮鍚嚎紼?/span>
8 聽MyThread聽thread聽 = 聽 new
聽MyThread;
9 聽thread.start();
2.澹版槑涓涓被瀹炵幇Runnable鎺ュ彛騫跺疄鐜皉un鏂規硶錛?/p>
1 聽class 聽MyRunnable聽 implements
聽Runnable聽{
2 聽聽聽聽聽 public 聽 void
聽run()聽{
3 聽
聽聽聽聽聽聽聽聽...
4 聽
聽聽聽聽}
5 聽
};
6 聽
7 聽// 聽寮鍚嚎紼嬄?/span>
8 聽MyThread聽thread聽 = 聽 new 聽MyThread( new
聽MyRunnable);
9 聽thread.start();
鍏蜂綋瀹炵幇
Java鐨勫疄鐜版柟寮忚繕綆椾紭闆咃紝鎴戜滑涔熷彲浠ュ湪C++涓ā鎷燂紝鐢變簬綃囧箙鎵闄愶紝鍦ㄨ繖閲屾垜浠彧鍏蟲敞鍩烘湰鍔熻兘鐨勫疄鐜幫細thread.h 聽1 聽#ifndef聽THREAD_H 聽2 聽#define聽THREAD_H 聽3 聽聽4 聽#include聽 < windows.h > 聽5 聽聽6 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 聽7 聽聽聽聽聽 private :聽\ 聽8 聽聽聽聽聽classname( const 聽classname & );聽\ 聽9 聽聽聽聽聽classname & 聽operator = ( const 聽classname & ); 10 聽11 聽struct聽Runnable聽{ 12 聽聽聽聽聽virtual聽 void 聽run()聽 = 聽 0 ; 13 聽聽聽聽聽virtual聽 ~ Runnable()聽{} 14 聽}; 15 聽16 聽class 聽Thread聽:聽 public 聽Runnable聽{ 17 聽聽聽聽聽CLASS_UNCOPYABLE(Thread) 18 聽public : 19 聽聽聽聽聽explicit聽Thread(Runnable * target聽 = 聽 0 ); 20 聽聽聽聽聽virtual聽 ~ Thread(); 21 聽聽聽聽聽virtual聽 void 聽run()聽{} 22 聽聽聽聽聽 void 聽start(); 23 聽聽聽聽聽 void 聽join(); 24 聽private : 25 聽聽聽聽聽 static 聽unsigned聽__stdcall聽threadProc( void * param); 26 聽private : 27 聽聽聽聽聽Runnable * _target; 28 聽聽聽聽聽HANDLE聽_handle; 29 聽}; 30 聽31 聽#endif /* THREAD_H */
鍦ㄤ笂闈㈢殑浠g爜涓垜浠厛瀹氫箟涓涓猂unnable綾伙紝騫朵負Runnable綾繪坊鍔犵函铏氬嚱鏁皉un錛岄渶瑕佺壒鍒敞鎰忕殑鏄疪unnable綾葷殑铏氭瀽鏋勫嚱鏁幫紝浠諱綍鎯寵鎴愪負鍩虹被鐨刢lass閮藉簲璇ュ0鏄庢瀽鏋勫嚱鏁頒負virtual銆?br />Thread綾葷洿鎺ョ戶鎵胯嚜Runnable錛孋LASS_UNCOPYABLE(Thread) 榪欎竴琛岀敤瀹忓0鏄嶵hread綾諱笉鍙嫹璐濓紝鍏蜂綋緇嗚妭璇風湅 鑰冭檻鐢∕acro鏇挎崲Uncopyable 銆俿tart鎴愬憳鍑芥暟鍜孞ava涓殑涓鏍鳳紝鐢ㄦ潵寮鍚竴涓嚎紼嬶紝join鎴愬憳鍑芥暟鐢ㄦ潵闃誨褰撳墠綰跨▼鐩村埌寮鍚殑綰跨▼鎵ц瀹屾瘯銆倀hreadProc浣滀負闈欐佹垚鍛樺嚱鏁扮敤鏉ヤ紶閫掔粰_beginthreadex錛岃嚦浜庝負浠涔堢敤_beginthreadex浠f浛CreateThread璇烽棶Google銆傚垵姝ョ殑瀹炵幇閮芥瘮杈冪畝鍗曪紝鐩存帴璐翠笂浠g爜錛?br />thread.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < process.h > 聽 // for聽_beginthreadex 聽3 聽聽4 聽Thread::Thread(Runnable * target聽 /* =聽0 */ ) 聽5 聽:_target( target ) 聽6 聽,_handle( 0 )聽{ 聽7 聽聽8 聽} 聽9 聽10 聽Thread:: ~ Thread()聽{ 11 聽聽聽聽聽 if 聽(_handle聽 != 聽 0 ) 12 聽聽聽聽聽聽聽聽聽CloseHandle(_handle); 13 聽聽聽聽聽 if 聽(_target聽 != 聽 0 ) 14 聽聽聽聽聽聽聽聽聽delete聽_target; 15 聽} 16 聽17 聽void 聽Thread::start()聽{ 18 聽聽聽聽聽 if 聽(_handle聽 != 聽 0 ) 19 聽聽聽聽聽聽聽聽聽 return ; 20 聽聽聽聽聽unsigned聽id; 21 聽聽聽聽聽_handle聽 = 聽reinterpret_cast < HANDLE > ( 22 聽聽聽聽聽聽聽聽聽_beginthreadex( 0 ,聽 0 ,聽threadProc,聽 this ,聽 0 ,聽 & id) 23 聽聽聽聽聽聽聽聽聽); 24 聽} 25 聽26 聽void 聽Thread::join()聽{ 27 聽聽聽聽聽 if (_handle聽 != 聽 0 )聽{ 28 聽聽聽聽聽聽聽聽聽WaitForSingleObject(_handle,聽INFINITE); 29 聽聽聽聽聽聽聽聽聽CloseHandle(_handle); 30 聽聽聽聽聽聽聽聽聽_handle聽 = 聽 0 ; 31 聽聽聽聽聽} 32 聽} 33 聽34 聽unsigned聽__stdcall聽Thread::threadProc( void * param)聽{ 35 聽聽聽聽聽Thread * p聽 = 聽static_cast < Thread *> (param); 36 聽聽聽聽聽 if 聽(p -> _target聽 != 聽 0 ) 37 聽聽聽聽聽聽聽聽聽p -> _target -> run(); 38 聽聽聽聽聽 else 39 聽聽聽聽聽聽聽聽聽p -> run(); 40 聽聽聽聽聽 return 聽 0 ; 41 聽}
涓嬮潰鏄祴璇曚唬鐮侊細test.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < iostream > 聽3 聽聽4 聽using聽namespace聽std; 聽5 聽聽6 聽// 絎竴縐嶆柟娉曪紝浠嶵hread綾葷戶鎵?/span> 聽7 聽struct聽MyThread聽:聽 public 聽Thread聽{ 聽8 聽聽聽聽聽virtual聽 void 聽run()聽{ 聽9 聽聽聽聽聽聽聽聽聽 for 聽( int 聽i聽 = 聽 0 ;聽i聽 < 聽 5 ;聽 ++ i)聽{ 10 聽聽聽聽聽聽聽聽聽聽聽聽聽cout聽 << 聽 " MyThread聽Running... " 聽 << 聽i聽 << 聽endl; 11 聽聽聽聽聽聽聽聽聽聽聽聽聽Sleep( 100 ); 12 聽聽聽聽聽聽聽聽聽} 13 聽聽聽聽聽} 14 聽}; 15 聽16 聽// 絎簩縐嶆柟娉曪紝鈥滃疄鐜扳漅unnable鎺ュ彛 17 聽struct聽MyRunnable聽:聽 public 聽Runnable聽{ 18 聽聽聽聽聽virtual聽 void 聽run()聽{ 19 聽聽聽聽聽聽聽聽聽 for 聽( int 聽i聽 = 聽 0 ;聽i聽 < 聽 5 ;聽 ++ i)聽{ 20 聽聽聽聽聽聽聽聽聽聽聽聽聽cout聽 << 聽 " MyRunnable聽Running... " 聽 << 聽i聽 << 聽endl; 21 聽聽聽聽聽聽聽聽聽聽聽聽聽Sleep( 300 ); 22 聽聽聽聽聽聽聽聽聽} 23 聽聽聽聽聽} 24 聽}; 25 聽26 聽int 聽main()聽{ 27 聽28 聽聽聽聽聽MyThread聽thread1; 29 聽聽聽聽聽Thread聽thread2( new 聽MyRunnable()); 30 聽聽聽聽聽thread1.start(); 31 聽聽聽聽聽thread2.start(); 32 聽聽聽聽聽thread1.join(); 33 聽聽聽聽聽thread2.join(); 34 聽35 聽聽聽聽聽 return 聽 0 ; 36 聽}
鍙兘鐨勮繍琛岀粨鏋滐細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 濡傛灉浣犵啛鎮塨oost搴擄紝浣犱細鐭ラ亾boost搴撶殑Thread鏋勯犲嚱鏁板彲浠ユ帴鍙楁櫘閫氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負鍙傛暟錛屽鏋滀綘瑙夊緱浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛榪樹笉澶熺畝媧侊紝涓嬩竴綃囦細鏈変竴涓瘮杈冨ソ鐨勬敼榪涖? ]]> 鑰冭檻鐢∕acro鏇挎崲Uncopyable http://www.shnenglu.com/ant/archive/2007/08/27/30908.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Mon, 27 Aug 2007 00:11:00 GMT http://www.shnenglu.com/ant/archive/2007/08/27/30908.html http://www.shnenglu.com/ant/comments/30908.html http://www.shnenglu.com/ant/archive/2007/08/27/30908.html#Feedback 2 http://www.shnenglu.com/ant/comments/commentRss/30908.html http://www.shnenglu.com/ant/services/trackbacks/30908.html 1. 灝嗚繖涓被鐨刢opy鏋勯犲嚱鏁板拰copy assignment鎿嶄綔絎﹂兘澹版槑涓簆rivate鑰屼笖娌℃湁瀹氫箟銆傜ず渚嬩唬鐮佸涓嬶細1 聽class 聽SomeClass聽{ 2 聽聽聽聽聽... 3 聽private : 4 聽聽聽聽聽 // 鍙湁澹版槑 5 聽聽聽聽聽SomeClass( const 聽SomeClass & ); 6 聽聽聽聽聽SomeClass & 聽operator = ( const 聽SomeClass & ); 7 聽};
2. 涓撻棬璁捐涓涓負浜嗛樆姝opying鍔ㄤ綔鑰岃璁$殑base class錛岃繖涓猙ase class鐩稿綋綆鍗曪細1 聽Uncopyable聽{ 2 聽protected :聽 // 鍏佽derived瀵硅薄鏋勯犲拰鏋愭瀯 3 聽聽聽聽聽Uncopyable()聽{} 4 聽聽聽聽聽 ~ Uncopyable()聽{} 5 聽private :聽 // 闃繪copying 6 聽聽聽聽聽Uncopyable( const 聽Uncopyable & ); 7 聽聽聽聽聽Uncopyable & 聽operator = ( const 聽Uncopyable & ); 8 聽};
涓轟簡闃繪鏌愪釜瀵硅薄濡係omeClass琚玞opying錛屾垜浠敮涓闇瑕佸仛鐨勫氨鏄戶鎵胯嚜Uncopyable錛?br />1 聽SomeClass聽:聽 private 聽Uncopyable聽{ 2 聽聽聽聽聽... 3 聽};
絎?縐嶆柟妗堣矊浼煎緢瀹岀編錛屽湪澶у鏁版儏鍐典笅涔熷伐浣滅殑寰堝ソ錛岀敋鑷砨oost搴撲篃騫挎硾閲囩敤浜?boost搴撲腑鐨勫彨noncopyable)銆傚綋鐒朵簡錛屽洜涓篣ncopyable涓嶅惈浠諱綍鏁版嵁錛岀鍚圗BO(empty base class optimization錛岀┖鐧藉熀綾繪渶浼樺寲)璧勬牸錛屼絾鐢變簬瀹冩繪槸鎵紨base class錛屽洜姝ゆ湁鍙兘瀵艱嚧澶氶噸緇ф壙錛岃孍BO涓鑸彧鍦ㄥ崟緇ф壙涓嬫墠鍙錛岀紪璇戝櫒閫氬父涓嶄細瀵規湁澶氫釜base class鐨刣erived classes鏂借EBO銆?br /> 濡傛灉浣犱笉鎯沖鑷村閲嶇戶鎵匡紝涓嶇鏄粠鎬ц兘涓婅繕鏄功鍐欎唬鐮佷笂錛屾瘮濡係omeClass緇ф壙鑷煇涓猙ase class錛屼綘鍙兘浼氬啓濡備笅浠g爜錛?br />1 聽class 聽SomeClass聽:聽 public 聽BaseClass,聽 private 聽Uncopyable聽{ 2 聽聽聽聽聽... 3 聽};
榪欒浜哄緢涓嶇埥錛岃鏄綘璺熸垜涓鏍鋒噿錛屼綘鑲畾涔熶笉浼氭効鎰忛噰鐢ㄧ涓縐嶆柟妗堬紝鍥犱負閭f剰鍛崇潃浣犱細鍦ㄦ瘡涓涓笉鎯寵copying鐨刢lass閲岄兘鍔犱笂閭d笁琛屼唬鐮併?br /> 濡傛灉鐢∕acro灝卞緢綆鍗曚簡錛屽嵆鐏墊椿鍙堟柟渚匡細 1 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 2 聽聽聽聽聽 private :聽\ 3 聽聽聽聽聽classname( const 聽classname & );聽\ 4 聽聽聽聽聽classname & 聽operator = ( const 聽classname & );
鐜板湪SomeClass鍙渶鍐欐垚榪欐牱錛?br />1 聽class 聽SomeClass聽{ 2 聽聽聽聽聽CLASS_UNCOPYABLE(SomeClass) 3 聽聽聽聽聽... 4 聽};
涓嶄粎鐪佷簨鑰屼笖鐏墊椿錛侊紒錛?img src ="http://www.shnenglu.com/ant/aggbug/30908.html" width = "1" height = "1" /> ]]>
嫩草影院久久国产精品 |
伊人久久大香线蕉影院95 |
69国产成人综合久久精品 |
久久久久国产精品嫩草影院
|
久久97精品久久久久久久不卡 |
日韩十八禁一区二区久久 |
久久国产亚洲精品无码 |
中文字幕无码久久精品青草 |
色综合久久综合网观看 |
久久精品三级视频 |
久久久久久伊人高潮影院 |
色悠久久久久久久综合网 |
99久久无色码中文字幕人妻 |
亚洲精品国精品久久99热 |
亚洲第一极品精品无码久久 |
久久国产色av免费看 |
精品综合久久久久久97超人 |
亚洲另类欧美综合久久图片区 |
亚洲国产精品无码成人片久久 |
久久久精品一区二区三区 |
久久亚洲精品国产精品婷婷
|
国产成人综合久久久久久 |
狠狠狠色丁香婷婷综合久久五月 |
嫩草影院久久99 |
亚洲AV无一区二区三区久久 |
97精品伊人久久久大香线蕉 |
久久久亚洲裙底偷窥综合
|
99久久精品国产综合一区 |
久久香综合精品久久伊人 |
久久91精品国产91 |
青青青国产精品国产精品久久久久 |
波多野结衣久久 |
久久精品国产亚洲5555 |
91精品国产综合久久久久久 |
久久久久久精品成人免费图片
|
精品永久久福利一区二区 |
国产精品久久久久国产A级 |
欧美亚洲国产精品久久 |
久久99精品久久久久久齐齐 |
久久大香萑太香蕉av |
久久久久香蕉视频 |