锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏈榪戞湁鐐瑰繖錛屾湰鏉ヨ鐢╝utoconf+automake鎶婅嚜宸辯殑浠g爜姊崇悊涓涓嬬殑錛屽洜涓哄伐浣滃仠浜嗚繎涓ゅ懆銆?/p>
鏈兂鐪嬬湅鏈変粈涔堝伐鍏峰彲浠ヨ嚜鍔ㄧ敓鎴怣akefile.am錛岀瓟妗堟槸錛?a mce_ target="_blank">Automake涓嶆敮鎸侀氶厤絎︼紝鑰屼笖榪樺彛鍙e0澹幫紝鎸尟鏈夎瘝銆傛棦鐒惰鐨勮繖涔堣█璇嶅嚳鍑匡紝鎯呮繁鎰忓垏錛屾垜鎯蟲垜涔熸病鏈夊繀瑕佺敤shell鐢熸垚Makefile.am浜嗐?/p>
鐢ㄧ潃鐢ㄧ潃錛屾垜鏈夌偣鎬鐤戜漢鐢熶簡錛氫笉鐭ラ亾浠涔堟椂鍊欓渶瑕佺敤autoconf鍜宎utomake銆傚鏋滄垜鍙槸騫蟲椂鑷繁鍐欎竴浜泃oy codes鐨勮瘽錛屾劅瑙夌敤autoconf鍜宎utomake鏈夌偣澶х偖鎵撹殜瀛愮殑鎰熻錛岃屼笖姣忔鏂板姞浠g爜鎴栬呮槸縐婚櫎浠g爜銆佺敋鑷蟲槸鏇存敼鐩綍錛岄兘瑕侀噸鏂版墽琛? autoconf銆乤utomake錛堜笉鐭ラ亾鎴戣鐨勫涓庝笉瀵癸級銆傚浜庝竴涓ぇ鍨嬮」鐩紝鎵ц涓嬈onfigure鍜宮ake鏄緢鐥涜嫤鐨勪竴浠朵簨錛宮ake鐨勪腑 闂寸洰鏍囨枃浠舵垨鑰呭簱鏂囦歡銆佹墽琛屾枃浠跺掓槸涓嶄竴瀹氶潪寰楀畬鍏╮ebuild錛宑onfigure鐨勯厤緗鏌ュ憿錛熸槸涓嶆槸涔熸湁綾諱技鏈哄埗錛熷弽姝f垜鍦ㄧ敤ogre鎴栬? cegui鐨勬椂鍊欙紝姣忔鎵ц./configure鏄噸鏂伴厤緗簡鐨勩?/p>
瀹為檯鍦ㄥ紑婧愰」鐩噷闈篃涓嶅彲鑳界淮鎶や袱濂梞akefile鍚с?/p>
鐪嬩簡涓涓?a mce_ target="_blank">googletest鐨勯厤緗紝鍊掓槸娓呯埥鐨勫緢錛屾渶澶х殑鐗圭偣鏄彧鏈変竴涓狹akefile.am錛岃繖鏍峰湪涓涓」鐩噷闈㈠彧闇瑕佺淮鎶や竴涓狹akefile.am灝卞浜嗐?/p>
cegui姣旇緝甯歌錛屾瘡涓瓙鐩綍閮戒細緇存姢涓涓狹akefile.am銆?/p>
闇瑕佺壒鍒敞鎰忕殑鏄痮gre浠?a mce_ target="_blank">1.7.0寮濮嬪凡緇忓紑濮嬩嬌鐢?a mce_ target="_blank">cmake浜?#8230;…
璇峰惉棰橈細綆$悊涓皬鍨嬮」鐩紝浣犲懼悜浜庝笅闈㈠摢涓伐鍏鳳紵
o make錛氶捇鏈ㄥ彇鐏紝鐜╃殑灝辨槸涓妧鏈紝緙栬瘧浠g爜錛屽彧鐢ㄨB鐨勶紝涓嶇敤鐗汢鐨勶紝浣犺鏄敤浠涔坈make錛屼綘閮戒笉濂芥剰鎬濊窡鍒漢鎵撴嫑鍛鹼紝榪欎箞緇忓吀鐨勪笢瑗匡紝綺鵑氶渶瑕佸涔咃紵瑕佹垜璇存庝箞鐫涔熷緱涓妸淇╂湀鍚э紝涓妸淇╂湀錛熼偅鏄叆闂紝鑷沖皯鍗婂勾錛屽氨榪欒繕寰楁湁Feldman鐨勬偀鎬э紝涓嶈垗鏄煎錛?/p>
o autoconf+automake錛氭棦鏈夌兢浼楀熀紜錛屽張鏈夋妧鏈惈閲忥紝浣犳槸閭f牱鎷夎槳鐨勭敺浜猴紝涓嶇鍦ㄤ粈涔堝湴鏂癸紝灝卞ソ鍍忔紗榛戜腑鐨勮悿鐏櫕涓鏍鳳紝閭f牱鐨勯矞鏄庯紝閭f牱鐨? 鍑轟紬銆備綘閭e咖閮佺殑鐪肩錛岀█鍢樼殑鑳″柍瀛愶紝紲炰箮鍏舵妧鐨勬寚娉曪紱鏃㈠彲浠ヨ葷瑧鍘熷浜虹殑鐢熶駭鍔涗綆涓嬶紝榪樺彲浠ラ剻瑙嗙幇浠d漢鐨勪笉瀛︽棤鏈?/p>
o cmake錛氬湪MSVCers闈㈠墠鎶笉璧峰ご錛屽湪UNIXers闈㈠墠浼間箮鏇存姮涓嶈搗澶達紱鑰宑make瀵筗INDOWS鍜孶NIX騫沖彴鐨勫畬緹庢敮鎸侊紝瓚充互璁╂墍鏈夌殑 MSVCers鍜孶NIXer鍦ㄤ綘闈㈠墠鎶笉璧峰ご錛屼綘鏄叕楦′腑鐨勬垬鏂楁満銆傛墍浠ヤ綘榪樻槸鍙互瓚鵑珮姘旀槀鐨勪涪涓嬩竴鍙ワ細璧癗B鐨勮礬錛岃SB璇村幓鍚с?/p>
Writen by Fox(yulefox.at.gmail.com)
鍦ㄥ叿浣撹璁轟箣鍓嶏紝鏈枃鍏堝帢娓匲UID錛圲niversally Unique IDentifier錛変笌GUID錛圙lobally Unique IDentifier錛夌殑鍏崇郴銆?/p>
鍦ㄥ垎甯冨紡銆佺綉緇溿佸崟鏈虹幆澧冧笅錛屼負浜嗚兘澶熶嬌鐢ㄥ叿鏈夋煇縐嶅艦寮忕殑ID鍞竴鏍囪瘑緋葷粺涓殑浠諱竴鍏冪礌錛岃繖鏍風殑ID鍙互涓嶄緷璧栦腑蹇冭璇佽嚜鍔ㄧ敓鎴愶紝浜庢槸UUID灝辮癁鐢熶簡銆?/p>
UUID鏍囧噯鐨勫巻鍙叉部闈╁拰鍏蜂綋瀹炵幇鍦?a title="RFC4122" target="_blank">RFC 4122銆?a title="ITU-T rec. x.667" target="_blank">ITU-T Rec. X.667鍜?a title="ISO/IEC 9834-8:2008" target="_blank">ISO/IEC 9834-8:2008涓潎鏈夎緇嗘弿榪般侷TU鍜孖SO閲囩敤鐨勬爣鍑嗗拰RFC 4122閮芥槸鍦║UID鐨勬棭鏈熺増鏈熀紜涓婂畬鎴愶紝鍚勭増鏈箣闂村叿鏈変竴鑷存у拰鍏煎鎬с?/p>
鍥犱負涓嶈兘淇濊瘉UUID鐨勫敮涓鎬э紝ITU鍜孖SO閽堝UUID鐨勪嬌鐢ㄩ兘鏈?a id="eac3" title="鍏嶈矗澹版槑" target="_blank">鍏嶈矗澹版槑銆?/p>
GUID涓鑸槸鎸嘙icrosoft瀵逛簬UUID鏍囧噯鐨勫疄鐜幫紝UUID鐨勫疄鐜板垯澶氳浜庡叾浠栫郴緇燂紙*NIX銆丮AC OS絳夛級涓傚湪浜嗚В浜嗚繖涓鍖哄埆鍚庯紝鏈枃灝嗙粺涓浣跨敤UUID鏉ユ寚浠e搴旂殑鍘熺悊銆佺畻娉曞強瀹炵幇銆?/p>
鏂囦腑鍏充簬UUID鐨勮璁哄叏閮ㄥ熀浜嶳FC 4122鍜孖TU-T Rec. X.667浠ュ強OSF銆両ETF銆両TU錛峊銆両SO銆丗IPS鐨勫悇縐嶆爣鍑嗘枃妗c傝孶UID鐨勭粏鑺傦紙濡傜粨鏋勩佽〃紺恒佺畻娉曘佸疄鐜扮瓑錛夊潎浠TU-T Rec. X667涓哄敮涓钃濇湰錛屾枃涓?#8220;鏈爣鍑?#8221;鍗蟲寚浠h钃濇湰銆?/p>
o 浠嬬粛
UUID鏄暱搴︿負16-byte錛?28-bit錛夌殑ID錛屼竴鑸互褰㈠f81d4fae-7dec-11d0-a765-00a0c91e6bf6鐨勫瓧絎︿覆浣滀負URN錛圲niform Resource Name錛岀粺涓璧勬簮鍚嶇О錛夈?/p>
o 鍔ㄦ満
鏃犻』涓績璁よ瘉錛岃嚜鍔ㄧ敓鎴愶紝鏀寔涓鍙版満鍣ㄦ瘡縐掔敓鎴?0M嬈★紙100綰崇綰э紝鍏墮殣鍚師鍥犳槸鎸囪兘澶熷尯鍒嗙殑鏈灝忔椂闂村崟浣嶄負100ns錛屽皢鏃墮棿浣滀負鍥犲瓙鏃訛紝榪炵畫鐢熸垚涓や釜UUID鐨勬椂闂磋嚦灝戣闂撮殧100ns錛夈傛柟渚垮瓨鍙栥佸垎閰嶃佹帓搴忋佹煡鎵俱?/p>
o 緇撴瀯
76543210765432107654321076543210
+ – - – = – - – = – - – = – - – +
15 | TimeLow | 12
11 | TimeMid | Version.. | 8
7 |Vari.. |Clock..| Node | 4
3 | Node | 0
+ – - – = – - – = – - – = – - – +
15 – 12: TimeLow 鏃墮棿鍊肩殑浣庝綅
11 – 10: TimeMid 鏃墮棿鍊肩殑涓綅
09 – 08: VersionAndTimeHigh 4浣嶇増鏈彿鍜屾椂闂村肩殑楂樹綅
07: VariantAndClockSeqHigh 2浣嶅彉浣擄紙ITU-T錛夊拰鏃墮挓搴忓垪楂樹綅
06: ClockSeqLow 鏃墮挓搴忓垪浣庝綅
05 – 00: Node 緇撶偣
hexOctet = hexDigit hexDigit
hexDigit =
“0″ / “1″ / “2″ / “3″ / “4″ / “5″ / “6″ / “7″ / “8″ / “9″ /
“a” / “b” / “c” / “d” / “e” / “f” /
“A” / “B” / “C” / “D” / “E” / “F”
UUID =
TimeLow
“-” TimeMid
“-” VersionAndTimeHigh
“-” VariantAndClockSeqHigh ClockSeqLow
“-” Node
UUID鐢變笂榪?涓煙鏋勬垚錛屾瘡涓煙緙栫爜涓鴻嫢騫插瓧鑺傦紝騫朵互16榪涘埗鏁拌〃紺鴻繖128浣嶇殑UUID錛岀浉閭誨煙浠ュ噺鍙?#8220;-”鍒嗛殧 錛圴ariantAndClockSeqHigh鍜孋lockSeqLow瀵瑰簲鐨勪袱涓瓧鑺備緥澶栵紝濡備笂鎵紺猴級銆傝緇撴瀯涓寘鍚増鏈紙Version錛夈佸彉浣? 錛圴ariant錛夈佹椂闂達紙Time錛夈佹椂閽熷簭鍒楋紙Clock Sequence錛夈佽妭鐐癸紙Note錛変俊鎭紙浠ユ棤絎﹀彿鏁村瀷鍊艱〃紺猴級銆?/p>
o 鍚堟硶鎬?/strong>
闄ゅ垽鏂璿ariant浣嶈緗槸鍚︽紜佸熀浜庢椂闂寸敓鎴愮殑UUID鏃墮棿鍊兼槸鍚︿負鏈粡鍒嗛厤鐨勫皢鏉ユ椂闂村錛屽疄闄呭簲鐢ㄤ腑娌℃湁鍏朵粬鏈哄埗鍙互鍒ゅ畾UUID鏄惁鍚堟硶銆?/p>
o 鍙樹綋
Variant浣嶆槸UUID絎?瀛楄妭錛圴ariantAndClockSeqHigh錛夌殑鏈楂?浣嶏紝
7 6 5 Description
0 – – NCS鍚戝悗鍏煎
1 0 – 鏈爣鍑?br> 1 1 0 Microsoft鍚戝悗鍏煎
1 1 1 ITU-T Rec. X.667淇濈暀
o 鐗堟湰
UUID鐨勭敓鎴愭湁鏃墮棿銆佸悕縐般侀殢鏈烘暟涓夌絳栫暐錛屼互絎?瀛楄妭錛圴ersionAndTimeHigh錛夌殑鏈楂?浣嶈〃紺恒?/p>
鐩墠UUID瀹氫箟鏈?涓増鏈細
7 6 5 4 Ver Description
0 0 0 1 1 鍩轟簬鏃墮棿鐨勭増鏈紙鏈爣鍑嗭級
0 0 0 0 2 浣跨敤宓屽叆寮廝OSIX錛圖CE瀹夊叏鐗堟湰錛?br> 0 0 1 1 3 浣跨敤MD5鍝堝笇鐨勫熀浜庡悕縐扮殑鐗堟湰錛堟湰鏍囧噯錛?br> 0 1 0 0 4 鍩轟簬闅忔満鏁扮殑鐗堟湰錛堟湰鏍囧噯錛?br> 0 1 0 1 5 浣跨敤SHA-1鐨勫熀浜庡悕縐扮殑鐗堟湰錛堟湰鏍囧噯錛?/p>
o 鏃墮棿
鏃墮棿鏄竴涓?0浣嶇殑鏁村瀷鍊鹼紙闄?浣嶇増鏈彿澶栫殑鍓?瀛楄妭錛夛紝瀵瑰簲UTC錛堟牸鏋楀凹娌繪椂闂?582騫?0鏈?5鏃ュ崍澶滃錛夌殑100ns鏃墮棿闂撮殧璁℃暟銆?/p>
瀵逛簬ver 4鍜?錛岃鍊煎垎鍒搴斾竴涓殢鏈烘暟鍜屼竴涓叏灞鍞竴鐨勫悕縐般?/p>
o 鏃墮挓搴忓垪
瀵瑰熀浜庢椂闂寸殑UUID鐗堟湰錛屾椂闂村簭鍒楃敤浜庨伩鍏嶅洜鏃墮棿鍚戝悗璁劇疆鎴栬妭鐐瑰兼敼鍙樺彲鑳介犳垚鐨刄UID閲嶅錛屽鍩轟簬鍚嶇О鎴栭殢鏈烘暟鐨勭増鏈悓鏍鋒湁鐢細鐩殑閮芥槸涓轟簡闃叉UUID閲嶅銆?/p>
濡傛灉鍓嶄竴鏃墮挓搴忓垪宸茬煡錛岄氳繃鑷瀹炵幇鏃墮挓搴忓垪鍊肩殑鏀瑰彉錛涘惁鍒欙紝閫氳繃瀵嗙爜瀛︼紙浼級闅忔満鏁拌緗柊鐨勬椂閽熷簭鍒楀箋?/p>
o 鑺傜偣
瀵瑰熀浜庢椂闂寸殑UUID鐗堟湰錛岃妭鐐圭敱48浣嶇殑鍗曟挱MAC鍦板潃鏋勬垚銆傚浜庢病鏈塎AC鍦板潃鐨勭郴緇燂紝鑺傜偣鍊間負涓涓瘑鐮佸錛堜吉錛夐殢鏈烘暟錛堜負闃叉涓嶮AC鍦板潃鍙戠敓紕版挒錛岄渶璁劇疆澶氭挱浣嶏級銆?/p>
o 紜畾UTC鏃墮棿錛?0浣?Time錛夊拰鏃墮棿搴忓垪鍊鹼紙14浣?ClockSequence錛夛紱
o 璁劇疆TimeLow錛堝搴擳ime鐨?1-0浣嶏級錛?/p>
o 璁劇疆TimeMid錛堝搴擳ime鐨?7-32浣嶏級錛?/p>
o 璁劇疆VersionAndTimeHigh錛?浣嶇増鏈彿鍙奣ime鐨?9-48浣嶏級錛?/p>
o 璁劇疆VariantAndClockSeqHigh錛堝彉浣撲綅鍙婂搴擟lockSequence鐨?3-8浣嶏級錛?/p>
o 璁劇疆ClockSeqLow錛堝搴擟lockSequence鐨?-0浣嶏級錛?/p>
o 璁劇疆Node錛堝搴?8浣峂AC鍦板潃錛夈?/p>
o 鍩轟簬鍚嶇О鐨刄UID鐢熸垚綆楁硶
o 閽堝鐩稿簲鐨勫懡鍚嶇┖闂達紙濡侱NS銆乁RL銆丱ID絳夛級鍒嗛厤涓涓猆UID浣滀負鎵鏈塙UID鐨勫懡鍚嶇┖闂存爣璇嗭紱
o 灝嗗悕縐拌漿鎹負瀛楄妭鏁板垪錛?/p>
o 浣跨敤MD5鎴朣HA-1綆楁硶瀵逛笌鍚嶇О鍏寵仈鐨勫懡鍚嶇┖闂存爣璇嗚繘琛岃綆楋紝浜х敓16瀛楄妭鍝堝笇緇撴灉錛?/p>
o 璁劇疆TimeLow錛堝搴斿搱甯屽肩殑3-0瀛楄妭錛夛紱
o 璁劇疆TimeMid錛堝搴斿搱甯屽肩殑5-4瀛楄妭錛夛紱
o 璁劇疆VersionAndTimeHigh錛堝搴斿搱甯屽肩殑7-6瀛楄妭錛夛紝浠ョ浉搴旂増鏈彿閲嶅啓瀵瑰簲浣嶏紙絎?瀛楄妭鐨勯珮4浣嶏級錛?/p>
o 璁劇疆VariantAndClockSeqHigh錛堝搴斿搱甯屽肩殑絎?瀛楄妭錛夛紝閲嶅啓鍙樹綋瀵瑰簲浣嶏紙絎?瀛楄妭鐨勯珮2浣嶏紝鏈爣鍑嗗搴斿間負10錛夛紱
o 璁劇疆ClockSeqLow錛堝搴斿搱甯屽肩殑絎?瀛楄妭錛夛紱
o 璁劇疆Node錛堝搴斿搱甯屽肩殑15-10瀛楄妭錛夈?/p>
鐢? 浜嶮D5紕版挒闂錛孧D5鍙敤浜庡悜鍚庡吋瀹圭殑UUID鐢熸垚錛屼笉鍐嶈鎺ㄨ崘浣跨敤銆傜敱浜嶴HA-1鍝堝笇緇撴灉涓?60浣嶏紙20瀛楄妭錛夛紝鏈畻娉曚腑錛岄渶瑕佸皢FIPS PUB 180-2涓殑SHA-1綆楁硶鐨勫搱甯屽煎瓧鑺傞『搴忓弽杞紙瀛楄妭鍐呴『搴忎笉鍙橈級錛孶UID浣跨敤鍏?5-0瀛楄妭錛?9-16瀛楄妭琚涪寮冦?/p>
o 鍩轟簬闅忔満鏁扮殑UUID鐢熸垚綆楁硶
o 璁劇疆VariantAndClockSeqHigh鐨勫彉浣撲綅鍊間負10錛?/p>
o 璁劇疆VersionAndTimeHigh鐨?浣嶇増鏈彿錛?/p>
o 璁劇疆鍓╀綑浣嶄負闅忔満鍊箋?/p>
鏈枃涓璁虹殑瀵嗙爜瀛﹂殢鏈烘暟錛屼富瑕佹牴鎹郴緇熷彲浠ユ彁渚涚殑淇℃伅錛堝唴瀛樸佺‖鐩樸佸彞鏌勩佺▼搴忚繍琛岀殑綰跨▼銆佽繘紼嬨佸彞鏌勩佸爢鏍堢瓑錛夛紝鍒╃敤SHA-1絳夊搱甯岀畻娉曞緱鍒般?/p>
鍏朵粬鍏充簬瀵嗙爜瀛﹂殢鏈烘暟鐨勬弿榪幫紝鎴戞浘鍦?a id="dtto" title="鍏鋒湁瀵嗙爜瀛︽剰涔夌殑PRNG錛圕SPRNG錛? target="_blank">榪欑瘒鏂囩珷涓畝鍗曟彁鍒般?/p>
浠ュ墠鏇劇粡璁ㄨ榪?a target="_blank">Singleton鐨勫疄鐜?/a>錛岃繖嬈″湪瀵圭収ACE鍜孊oost浠g爜鐨勬椂鍊欙紝鍙堥噸鏂板瑙嗕簡涓涓嬩簩鑰呭Singleton涓嶅悓鐨勫疄鐜般傚叾闂寸殑宸埆涔熶綋鐜頒簡涓嶅悓鐨勭紪紼嬪摬瀛︼細ACE鐨勫疄鐜版洿鍔犲亸閲嶅綰跨▼涓殑瀹夊叏鍜屾晥鐜囬棶棰橈紱Boost鐨勫疄鐜板垯鍋忛噸浜庝嬌鐢ㄨ璦鑷韓鐨勭壒鎬ф弧瓚砈ingleton妯″紡鐨勫熀鏈渶姹傘?
o ACE鐨勫疄鐜?/strong> Douglas C. Schmidt鍦?a target="_blank">Double-Checked Locking: An Optimization Pattern for Efficiently Initializing and Accessing Thread-safe Objects涓鏂囦腑瀵筪ouble-check lock錛堜竴鑸瘧涓哄弻媯閿侊級榪涜浜嗚緇嗙殑闃愯堪銆? ACE鐨凷ingleton浣跨敤Adapter妯″紡瀹炵幇瀵瑰叾浠栫被鐨勯傞厤錛屼嬌涔嬪叿鏈夊叏灞鍞竴鐨勫疄渚嬨傜敱浜嶤++鏍囧噯騫墮潪鏄庣‘鎸囧畾鍏ㄥ眬闈欐佸璞$殑鍒濆鍖栭『搴忥紝ACE浣跨敤double-check lock淇濊瘉綰跨▼瀹夊叏錛屽茍浣夸箣涓嶅彈鍏ㄥ眬闈欐佸璞″垵濮嬪寲欏哄簭鐨勫獎鍝嶏紝鍚屾椂涔熼伩鍏嶄簡鍏ㄥ眬闈欐佸疄鐜版柟寮忕殑鍒濆鍖栧悗涓嶄嬌鐢ㄧ殑寮閿銆? 濡傛灉浣犺兘澶熷噯紜殑鍖哄垎浠ヤ笅涓夌瀹炵幇鐨勫紛绔拰闅愭偅錛屽double-check lock涔熷氨鏈変簡瓚沖鐨勪簡瑙c? // ------------------------------------------- // --------------------------------------------- // --------------------------------------------- 鏇村璇︽儏錛岃Schmidt鑰佸笀鐨勫師鏂囧拰ACE_Singleton瀹炵幇銆? o Boost鐨勫疄鐜?/strong> Boost鐨凷ingleton涔熸槸綰跨▼瀹夊叏鐨勶紝鑰屼笖娌℃湁浣跨敤閿佹満鍒躲傚綋鐒訛紝Boost鐨凷ingleton鏈変互涓嬮檺鍒訛紙閬典粠榪欎簺闄愬埗錛屽彲浠ユ彁楂樻晥鐜囷級錛? o The classes below support usage of singletons, including use in program startup/shutdown code, AS LONG AS there is only one thread running before main() begins, and only one thread running after main() exits. o This class is also limited in that it can only provide singleton usage for classes with default constructors. // T must be: no-throw default constructible and no-throw destructible singleton_default(); public: // If, at any point (in user code), singleton_default<T>::instance() // The following line does nothing else than force the instantiation return obj; 瀵逛簬澶氭暟Singleton浣跨敤錛孊oost鎻愪緵鐨勭増鏈畬鍏ㄨ兘澶熸弧瓚抽渶姹傘備負浜嗘晥鐜囷紝鎴戜滑鏈夊繀瑕佸鍏朵嬌鐢ㄤ綔鍑轟竴瀹氱殑闄愬埗銆?/p> 鑰屽湪澶氱嚎紼嬬紪紼嬩腑錛屽垯鏈夊繀瑕佷嬌鐢╠ouble-check lock闄嶄綆棰戠箒鍔犻攣甯︽潵鐨勫紑閿銆?/p> ------------------------------------------------------------------------------- PS: 嬈h祻Soft鐨勪竴鍙ヨ瘽錛?strong>緇忓緱璧瘋鎯戯紝鑰愬緱浣忓瘋瀵?/strong>銆?/p>
class Singleton
{
public:
static Singleton *instance (void)
{
// Constructor of guard acquires
// lock_ automatically.
Guard<Mutex> guard (lock_);
// Only one thread in the
// critical section at a time.
if (instance_ == 0)
instance_ = new Singleton;
return instance_;
// Destructor of guard releases
// lock_ automatically.
}
private:
static Mutex lock_;
static Singleton *instance_;
};
static Singleton *instance (void)
{
if (instance_ == 0) {
Guard<Mutex> guard (lock_);
// Only come here if instance_
// hasn鈥檛 been initialized yet.
instance_ = new Singleton;
}
return instance_;
}
class Singleton
{
public:
static Singleton *instance (void)
{
// First check
if (instance_ == 0)
{
// Ensure serialization (guard
// constructor acquires lock_).
Guard<Mutex> guard (lock_);
// Double check.
if (instance_ == 0)
instance_ = new Singleton;
}
return instance_;
// guard destructor releases lock_.
}
private:
static Mutex lock_;
static Singleton *instance_;
};
template <typename T>
struct singleton_default
{
private:
struct object_creator
{
// This constructor does nothing more than ensure that instance()
// is called before main() begins, thus creating the static
// T object before multithreading race issues can come up.
object_creator() { singleton_default<T>::instance(); }
inline void do_nothing() const { }
};
static object_creator create_object;
typedef T object_type;
// is called, then the following function is instantiated.
static object_type & instance()
{
// This is the object that we return a reference to.
// It is guaranteed to be created before main() begins because of
// the next line.
static object_type obj;
// of singleton_default<T>::create_object, whose constructor is
// called before main() begins.
create_object.do_nothing();
}
};
template <typename T>
typename singleton_default<T>::object_creator
singleton_default<T>::create_object;
鍦ㄤ嬌鐢↖OCP鏃訛紝鏈閲嶈鐨勫嚑涓狝PI灝辨槸GetQueueCompeltionStatus銆乄SARecv銆乄SASend錛屾暟鎹殑I/O鍙婂叾瀹屾垚鐘舵侀氳繃榪欏嚑涓帴鍙h幏鍙栧茍榪涜鍚庣畫澶勭悊銆?/p>
GetQueueCompeltionStatus attempts to dequeue an I/O completion packet from the specified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation associated with the completion port to complete.
BOOL WINAPI GetQueuedCompletionStatus(
__in HANDLE CompletionPort,
__out LPDWORD lpNumberOfBytes,
__out PULONG_PTR lpCompletionKey,
__out LPOVERLAPPED *lpOverlapped,
__in DWORD dwMilliseconds
);
If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lpNumberOfBytes, lpCompletionKey, and lpOverlapped parameters.
闄や簡鍏沖績榪欎釜API鐨刬n & out錛堣繖鏄疢SDN寮澶寸殑鍑犺灝卞彲浠ュ憡璇夋垜浠殑錛変箣澶栵紝鎴戜滑鏇村姞鍏沖績涓嶅悓鐨剅eturn & out鎰忓懗鐫浠涔堬紝鍥犱負鐢變簬鍚勭宸茬煡鎴栨湭鐭ョ殑鍘熷洜錛屾垜浠殑紼嬪簭騫朵笉鎬繪槸鏈夋紜殑return & out銆?/p>
If *lpOverlapped is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the lpNumberOfBytes and lpCompletionKey parameters. To get extended error information, call GetLastError. If the function did not dequeue a completion packet because the wait timed out, GetLastError returns WAIT_TIMEOUT.
鍋囪鎴戜滑鎸囧畾dwMilliseconds涓篒NFINITE銆?/p>
榪欓噷甯歌鐨勫嚑涓敊璇湁錛?/p>
WSA_OPERATION_ABORTED (995): Overlapped operation aborted.
鐢變簬綰跨▼閫鍑烘垨搴旂敤紼嬪簭璇鋒眰錛屽凡鏀懼純I/O 鎿嶄綔銆?/p>
MSDN: An overlapped operation was canceled due to the closure of the socket, or the execution of the SIO_FLUSH command in WSAIoctl. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.
鎴愬洜鍒嗘瀽錛氳繖涓敊璇竴鑸槸鐢變簬peer socket琚?strong>closesocket鎴栬?strong>WSACleanup鍏抽棴鍚庯紝閽堝榪欎簺socket鐨刾ending overlapped I/O operation琚腑姝€?/p>
瑙e喅鏂規錛氶拡瀵箂ocket錛屼竴鑸簲璇ュ厛璋冪敤shutdown紱佹I/O鎿嶄綔鍚庡啀璋冪敤closesocket鍏抽棴銆?/p>
涓ラ噸紼嬪害錛?strong>杞誨井鏄撳鐞?/strong>銆?/p>
WSAENOTSOCK (10038): Socket operation on nonsocket.
MSDN: An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
鎴愬洜鍒嗘瀽錛氬湪涓涓潪濂楁帴瀛椾笂灝濊瘯浜嗕竴涓搷浣溿?/p>
浣跨敤closesocket鍏抽棴socket涔嬪悗錛岄拡瀵硅invalid socket鐨勪換浣曟搷浣滈兘浼氳幏寰楄閿欒銆?/p>
瑙e喅鏂規錛氬鏋滄槸澶氱嚎紼嬪瓨鍦ㄥ鍚屼竴socket鐨勬搷浣滐紝瑕佷繚璇佸socket鐨処/O鎿嶄綔閫昏緫涓婄殑欏哄簭錛屽仛濂絪ocket鐨刧raceful disconnect銆?/p>
涓ラ噸紼嬪害錛?strong>杞誨井鏄撳鐞?/strong>銆?/p>
WSAECONNRESET (10054): Connection reset by peer.
榪滅▼涓繪満寮鴻揩鍏抽棴浜嗕竴涓幇鏈夌殑榪炴帴銆?/p>
MSDN: An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
鎴愬洜鍒嗘瀽錛氬湪浣跨敤WSAAccpet銆乄SARecv銆乄SASend絳夋帴鍙f椂錛屽鏋減eer application紿佺劧涓錛堝師鍥犲涓婃墍榪幫級錛屽線鍏跺搴旂殑socket涓婃姇閫掔殑operations灝嗕細澶辮觸銆?/p>
瑙e喅鏂規錛氬鏋滄槸瀵規柟涓繪満鎴栫▼搴忔剰澶栦腑姝紝閭e氨鍙湁鍚勫畨澶╁懡浜嗐備絾濡傛灉榪欑▼搴忔槸浣犲啓鐨勶紝鑰屼綘鍙槸hard close錛岄偅灝辯敱涓嶅緱鍒漢浜嗐傝嚦灝戯紝浣犺鐭ラ亾榪欐牱鐨勯敊璇凡緇忓嚭鐜頒簡錛屽氨涓嶈鍐嶈垂鍔茬殑緇х畫鎶曢掓垨絳夊緟浜嗐?/p>
涓ラ噸紼嬪害錛?strong>杞誨井鏄撳鐞?/strong>銆?/p>
WSAECONNREFUSED (10061): Connection refused.
鐢變簬鐩爣鏈哄櫒縐瀬鎷掔粷錛屾棤娉曡繛鎺ャ?/p>
MSDN: No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host鈥攖hat is, one with no server application running.
鎴愬洜鍒嗘瀽錛氬湪浣跨敤connect鎴朩SAConnect鏃訛紝鏈嶅姟鍣ㄦ病鏈夎繍琛屾垨鑰呮湇鍔″櫒鐨勭洃鍚槦鍒楀凡婊★紱鍦ㄤ嬌鐢╓SAAccept鏃訛紝瀹㈡埛绔殑榪炴帴璇鋒眰琚玞ondition function鎷掔粷銆?/p>
瑙e喅鏂規錛欳all connect or WSAConnect again for the same socket. 絳夊緟鏈嶅姟鍣ㄥ紑鍚佺洃鍚┖闂叉垨鏌ョ湅琚嫆緇濈殑鍘熷洜銆?strong>鏄笉鏄暱鐨勪笐鎴栬呴挶娌$粰澶燂紝瑕佷笉灝辨槸鏈嶅姟鍣ㄦ嫆緇濇帴鍙楀ぉ浠瘋柂閰嚜涓誨垱涓氬幓浜嗭紵
涓ラ噸紼嬪害錛?strong>杞誨井鏄撳鐞?/strong>銆?/p>
WSAENOBUFS (10055): No buffer space available.
鐢變簬緋葷粺緙撳啿鍖虹┖闂翠笉瓚蟲垨鍒楅槦宸叉弧錛屼笉鑳芥墽琛屽鎺ュ瓧涓婄殑鎿嶄綔銆?/p>
MSDN: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
鎴愬洜鍒嗘瀽錛氳繖涓敊璇槸鎴戞煡鐪嬮敊璇棩蹇楀悗錛屾渶鍦ㄦ剰鐨勪竴涓敊璇傚洜涓烘湇鍔″櫒瀵逛簬娑堟伅鏀跺彂鏈夋槑紜檺鍒訛紝濡傛灉緙撳啿鍖轟笉瓚沖簲璇ユ棭灝卞鐞嗕簡錛屼笉鍙兘寰呭埌send/recv澶辮觸鍟娿傝屼笖榪欎釜閿欒鍦ㄤ箣鍓嶇殑鐗堟湰涓嚑涔庢病鏈夊嚭鐜拌繃銆傝繖涔熸槸榪欑瘒鏂囩珷鐨勪富瑕佸唴瀹廣傚儚connect鍜宎ccept鍥犱負緙撳啿鍖虹┖闂翠笉瓚抽兘鍙互鐞嗚В錛岃屼笖鍗遍櫓涓嶉珮錛屼絾濡傛灉send/recv閫犳垚鎷ュ牭騫舵伓鎬у驚鐜笅鍘伙紝楹葷儲灝卞ぇ浜嗭紝鑷沖皯璇存槑涔嬪墠鐨勯獙璇侀昏緫鏈夌枏婕忋?/p>
WSASend澶辮觸鐨勫師鍥犳槸錛歍he Windows Sockets provider reports a buffer deadlock. 榪欓噷鎻愬埌鐨勬槸buffer deadlock錛屾樉鐒舵槸鐢變簬澶氱嚎紼婭/O鎶曢掍笉褰撳紩璧風殑銆?/p>
瑙e喅鏂規錛氬湪娑堟伅鏀跺彂鍓嶏紝瀵規渶澶ф寕璧風殑娑堟伅鎬葷殑鏁伴噺鍜屽閲忚繘琛屾楠屽拰鎺у埗銆?/p>
涓ラ噸紼嬪害錛?strong>涓ラ噸銆?/p>
鏈枃涓昏鍙傝?a target="_blank">MSDN銆?/p>
************* 璇存槑 *************
Fox鍙槸瀵硅嚜宸卞叧蹇冪殑鍑犱釜閿欒鍜孉PI鍙傜収MSDN榪涜鍒嗘瀽錛屼笉鎻愪緵棰濆甯姪銆?/p>
鍛ㄤ紵鏄庤佸笀搴旇鏄鏍歌綆楅鍩熺殑鑰佷漢浜嗐?/p>
榪欏嚑鏃ュ洜涓烘兂鎵炬壘鏃犻攣錛坙ock-free錛夋柟闈㈢殑淇℃伅錛屽氨鎵撳紑浜?a target="_blank">鍛ㄨ佸笀鐨刡log銆傜湅鍒?a target="_blank">澶氭牳緋葷粺涓笁縐嶅吀鍨嬮攣绔炰簤鐨勫姞閫熸瘮鍒嗘瀽榪欑瘒鏂囩珷鏃訛紝瑙夊緱鑰佸笀寮鴻皟澶氭牳璁$畻鏁堢巼鏄湁蹇呰鐨勶紝浣嗘嬁Amdahl 瀹氬緥鍜孏ustafson瀹氬緥浣滃姣旀湁鐐逛笉鎭板綋銆?/p>
鎸夌収鎴戠殑鐞嗚В錛岃繖涓や釜瀹氬緥鎵鍒葷敾鐨勫唴瀹規槸瀹屽叏涓鑷寸殑錛屽彧鏄鍔犻熸瘮鐨勫畾涔変笉涓鏍風艦浜嗐傝繖閲岋紝鎴戜滑閮戒互S(n)琛ㄧずn鏍哥郴緇熷鍏蜂綋紼嬪簭鐨勫姞閫熸瘮錛孠琛ㄧず涓茶閮ㄥ垎璁$畻鏃墮棿姣斾緥銆?/p>
Amdahl 瀹氬緥鐨勫姞閫熸瘮錛歋(n) 錛?浣跨敤1涓鐞嗗櫒鐨勪覆琛岃綆楁椂闂?/ 浣跨敤n涓鐞嗗櫒鐨勫茍琛岃綆楁椂闂?/p>
S(n) = 1/(K+(1-K)/n) = n/(1+(n-1)K)
Gustafson瀹氬緥鐨勫姞閫熸瘮錛歋(n) 錛?浣跨敤n涓鐞嗗櫒鐨勫茍琛岃綆楅噺 / 浣跨敤1涓鐞嗗櫒鐨勪覆琛岃綆楅噺
S(n) = K+(1-K)n
閫氫織鐨勮錛孉mdahl 瀹氬緥灝嗗伐浣滈噺鐪嬩綔1錛屾湁n鏍鎬篃鍙兘鍒嗘媴1-K鐨勫伐浣滈噺錛涜孏ustafson瀹氬緥鍒欏皢鍗曟牳宸ヤ綔閲忕湅浣?錛屾湁n鏍革紝灝卞彲浠ュ鍔爊(1-K)鐨勫伐浣滈噺銆?/p>
榪欎袱涓綆楀叕寮忛兘娌℃湁灝嗛攣寮閿鑰冭檻鍦ㄥ唴錛屾槸鐞嗘兂鍖栫殑銆傚懆鑰佸笀鎻愬埌璁捐涓嶅綋閫犳垚騫惰鍙樹覆琛岀殑闂涓庤繖涓や釜鍏紡璁$畻鏃犲叧銆傚洜涓轟換浣曞鏍歌綆楅兘瀛樺湪瀵逛覆琛屽拰騫惰鐨勮璁¤冮噺錛岃繖姝f槸紼嬪簭鍛樺湪浣跨敤澶氭牳騫惰鏃舵渶鍏沖績鐨勪簨鎯呫?/p>
鎬諱箣錛屼簩鑰呯殑鍖哄埆鍙湪浜庢佸害鐨勪笉鍚岋細涓涓秷鏋佹偛瑙傦紝涓涓Н鏋佷箰瑙傦紝鍏呭叾閲忔槸涓涓喎絎戣瘽錛岃屼簬澶氭牳璁$畻娌℃湁浠諱綍鍏寵仈銆?/p>
鎴戣榪欎簺涔熶笌澶氭牳璁$畻娌℃湁鍏寵仈錛屼笣姣病鏈夎川鐤戝鏍告晥鐜囩殑鎰忔濄傜浉鍙嶏紝鎴戞湡寰呰兘澶熼氳繃鎶鏈眰闈㈡彁楂樺鏍哥殑鏈夋晥璐熻澆銆?/p>鏈鍚庝竴鍙ラ澶栬瘽錛屽懆鑰佸笀浣跨敤Word鐨勬按騫充竴鑸細鎵鏈夋潵鑷猈ord鐨勬埅鍥鵑兘鏄湪欏甸潰瑙嗗浘鐩存帴鎴紝鎹㈣絎﹀拰鍏夋爣闅忓鍙銆?img src ="http://www.shnenglu.com/Fox/aggbug/95782.html" width = "1" height = "1" />
o *__ 搴?__* o
鍦ㄩ槄璇籄CE浠g爜鍜孋++NPv1, v2, APG鐨勬椂鍊欙紝鎴戞剰璇嗗埌涓涓棶棰橈細铏界劧紼嶆湁C++鍜岀綉緇滃熀紜鐨勫悓瀛﹂兘鍙互璇繪噦ACE錛屼絾濡傛灉浣犲OS錛堜簲澶х鐞嗘ā鍧楅兘鍖呭惈鍦ㄥ唴錛夈乀CP/IP銆丆++銆丏esign Patterns浜嗚В瓚婂錛屼綘灝辮秺鑳戒綋浼欰CE涓轟粈涔堥渶瑕佽繖涔堝簽鏉傦紝铏界劧瀹冧笉澶熷畬緹庯紙浣嗚嚦灝戞垜榪樻病鏈夎祫鏍兼潵鎵硅瘎榪欎竴鐐癸紝鎴戠幇鍦ㄦ渶甯告兂鍋氱殑涓涓姩浣滃氨鏄簲浣撴姇鍦幫級銆?/p>
鑰屼笖鎴戦殣綰︽劅瑙夊埌錛屾垜鐜板湪鎵鍐欑殑寰堝涓滆タ鍦ㄤ互鍚庯紙瀵逛簬鏈変簺浜烘垨璁稿氨鏄幇鍦級鐪嬫潵浼氱浉褰撲笉娣卞埢銆佺浉褰撲笉涓ヨ皚錛屼絾瀵逛簬涓孌靛涔犲巻紼嬶紝榪欎釜榪囩▼鏄繀鐒剁殑銆佸繀闇鐨勩?/p>
鍦–++NPv1涓紝Douglas C. Schmidt鎶婂師濮媠ocket鍙婂叾API鐨勭己闄鋒湁浜涘欖斿寲浜嗭紝姣斿涓孌靛姞涓婃敞閲娿佺┖琛屽湪鍐呯殑35琛岀殑浠g爜錛岃鎸囧嚭鏈?0澶勯敊璇箣澶氥傝繖灝卞儚寰堝鍏朵粬璇█鐨勫″鑰呮垨鍙嶄紶緇烠/C++鎸囬拡鑰呭湪鎵硅瘎鎸囬拡鏃剁殑璇存硶涓鏍楓傞暱鏈熶嬌鐢ㄥ師濮媠ocket鍜屾寚閽堢殑鍚屽瀵規鎰熻寰堜笉鑸掓湇錛屼綍鍐祍ocket API鎻愪緵浜嗗ぇ閲忛敊璇嫻嬬殑鎺ュ彛錛岃嚦澶氭槸涓嶅鍙嬪ソ緗簡銆備綘濂藉氨濂戒簡錛屾病蹇呰鎶撲綇鍒漢涓欏跨棝鎵瑰惂錛屻庢湰鏄悓鏍圭敓錛岀浉鐓庝綍澶ャ忋?/p>
铏界劧Solaris銆丩inux鐨勫緢澶氱増鏈強Windows瀵硅搗婧愪簬Berkeley鐨剆ocket API榪涜浜嗛噸鍐欙紝浣嗕笉鍙惁璁わ紝鐢變簬鍘嗗彶鍘熷洜鍜孭OSIX鏍囧噯鐨勫瓨鍦紝瀵逛簬浣跨敤鑰呰岃█錛屾垜浠彲浠ユ棤瑙嗚繖浜汚PI鐨勫疄鐜板樊寮傘傚彧鏄竴鏃︽垜浠粠socket閫氫俊鎵╁睍鍒板叾浠朓PC閫氫俊鐨勮瘽錛屽氨闇瑕佹瑙嗗悇縐岻/O緇嗚妭鐨勫樊寮備簡銆?/p>
鐢變簬UNIX涓紝瀵逛簬socket, file, pipe, device鐨勫ぇ澶氭暟鎿嶄綔錛屾弿榪扮閮芥槸閫氱敤鐨勶紙榪欎竴鐐癸紝OS涓婇潰璁茬殑鏇存竻妤氫簺錛夈傝學indows涓紝鍙ユ焺澶у涓嶈兘浜掓崲錛坰ocket瀵逛簬MS鏉ヨ鏄埗鏉ュ搧錛夈傜郴緇熷拰鏍囧噯鐨勪笉涓鑷村鑷村湴鍧銆佸崗璁拰API鐨勬販鏉傜敋鑷蟲販涔便?/p>
UNIX涓嬬殑鎻忚堪絎﹀拰Windows鐨勫彞鏌勫彲浠ョ湅浣滄槸鍚屼竴涓蹇碉紝鍙槸搴旂敤鐜涓嶄竴鏍鳳紝鎵鎻忚堪鐨勫唴瀹逛篃鏃跺父涓嶄竴鏍鳳紝鍐嶇畝鍗曚簡璇達紝瀹冧滑閮芥槸涓涓暣鍨嬬殑ID銆?/p>
ACE鐨勬簮鐮佷腑浣跨敤浜嗗ぇ閲忛澶勭悊鎸囦護錛屽挨鍏跺湪璺ㄥ鉤鍙?緙栬瘧鐜鐨勯儴鍒嗘洿鍔犳槑鏄俱傞壌浜嶤/C++鏍囧噯鐨勫崥澶ц兏鎬錛屾湁浜涙寚浠ら渶瑕侀槄璇葷浉鍏崇紪璇戝櫒鎻愪緵鐨勫府鍔╂枃妗o細
o #define (#, #@, ##) : GCC, MSVC
鍏朵腑鏈夎嫢騫蹭唬鐮佹枃浠朵互.inl涓哄悗緙錛岄噷闈㈡槸瀵歸儴鍒嗗嚱鏁扮殑鍐呰仈瀹炵幇錛屼互浣夸唬鐮佺粨鏋勭湅涓婂幓鏇村姞綆媧併傚鏋滅‘瀹氫嬌鐢ㄥ唴鑱斿嚱鏁扮殑璇濓紝*.inl灝嗚鍖呭惈浜?.h鐨勬渶鍚庯紝濡傛灉涓嶄嬌鐢紝鍒欏儚*.h涓鏍鳳紝鍖呭惈浜?.cpp鐨勫ご閮ㄣ?/p>
ACE閲囩敤doxygen杈撳嚭鏂囨。錛屽湪闃呰浠g爜娉ㄩ噴鏃惰兘澶熸劅鍙楀埌宸紓錛屼絾鍩烘湰涓嶄細褰卞搷闃呰銆?/p>
o * __ 鍏充簬絎?绔狅紙C++NPv1錛塤_ * o
ACE鎶借薄鐨勫湴鍧綾籄CE_Addr鎷ユ湁ACE_DEV_Addr, ACE_FILE_Addr, ACE_INET_Addr, ACE_SPIPE_Addr, ACE_UNIX_Addr浜斾釜瀛愮被銆傚浜庣嫮涔変笂鐨勭綉緇滈氫俊錛圱CP/IP錛夎岃█錛孉CE_INET_Addr瀵瑰簲浜庢垜浠啛鎮夌殑sockaddr_in銆?/p>
ACE_IPC_SAP鏄疘PC錛坕nterprocess communication錛塈/O鎿嶄綔綾葷殑root綾匯?/p>
浠庣紪鐮佺殑瑙掑害鐪嬶紝榪欎釜綾繪紓浜殑鍦版柟鍦ㄤ簬紺轟緥浜嗘娊璞$被鐨勫彟涓縐嶅疄鐜版柟寮忋?/p>
涓鎻愬埌鎶借薄綾伙紝澶у鏁頒漢鐨勭涓鍙嶅簲鏄痯ure virtual function銆傚綋涓涓熀綾葷‘瀹氶渶瑕佷嬌鐢╲irtual function鏃訛紝榪欐槸涓涓笉閿欑殑閫夋嫨銆備絾鎴戜滑閮界煡閬撹櫄鎷熷嚱鏁版湁寮閿銆傝屼笖瀵逛簬涓涓粨鏋勭畝鍗曠殑鎶借薄鍩虹被鍜屽叾緇ф壙瀛愮被錛堝挨鍏舵槸澶ч噺浣跨敤鏃訛級錛屼竴涓櫄鍑芥暟琛ㄥ甫鏉ョ殑寮閿浼氳鏁翠釜璁捐鏄懼緱鍗佸垎韞╄剼銆?/p>
鎴戜滑閮界煡閬撳浣曞己鍒惰涓涓被鏃犳硶浣跨敤default constructor錛坧rotected錛夈傚鏋滃鍩虹被浣跨敤璇ユ柟娉曪紝浠呬嬌瀛愮被鍏鋒湁public鐨刣efault constructor錛岃繖灝辮揪鍒頒簡瀹氫箟鎶借薄鍩虹被鐨勬晥鏋溿?/p>
virtual destructor鐨勬剰涔夊湪浜庨槻姝elete鐖剁被鎸囬拡錛堟寚鍚戝瓙綾誨璞★級鏃舵湭璋冪敤瀛愮被destructor銆傚湪姝や緥涓紝涓洪伩鍏嶈繖縐嶆儏鍐碉紝鍚屾牱灝哾estructor澹版槑涓簆rotected鍗沖彲銆?/p>
浠庤璁″疄鐜扮殑瑙掑害鐪嬶紝鐩歌緝浜巗ocket API錛孉CE_IPC_SAP鐨勫瓙綾籄CE_SOCK鎻愪緵浜嗙紪璇戞椂瀵瑰彞鏌勫悎娉曟х殑媯嫻嬨?/p>
浠庨昏緫鍔熻兘灞傞潰鍒掑垎錛宻ocket鏈変笁縐嶈鑹詫細
o active connection role (connector)錛氫富鍔ㄨ繛鎺?/p>
o passive connection role (acceptor)錛氳鍔ㄨ繛鎺?/p>
o communication role (stream)錛氭暟鎹氫俊
浣唖ocket API姣曠珶涓嶆槸OOD鍑烘潵鐨勶紝瀵逛簬涓涓猻ocket鎻忚堪絎︼紝涔熷畬鍏ㄦ病鏈夊繀瑕佸幓闄愬埗鍏舵媴璐熺殑鍔熻兘錛屾洿涓嶅彲鑳芥悶鎴愪笁縐嶄笉鍚岀殑socket銆傝孫OD鐨凙CE鍒欏彲浠ヨ交鏄撳疄鐜板socket瀵硅薄鍙婂叾鎿嶄綔鐨勫皝瑁呫?/p>
宸ュ巶綾籄CE_SOCK_Connector鏄竴涓富鍔ㄥ垱寤洪氫俊绔殑宸ュ巶綾匯俿ocket API涓殑connect鎺ュ彛鍙槸涓轟竴涓猻ocket寤虹珛涓庡叾瀹僷eer鐨勭綉緇滆繛鎺ワ紝鑰屼笉浜х敓鏂扮殑socket瀹炰緥錛屼篃涓嶄緷璧栦簬浠諱綍鍏跺畠socket銆傚悓鏍鳳紝ACE_SOCK_Connector鍙槸涓轟竴涓狝CE_SOCK_Stream瀵硅薄錛堝鐢ㄤ簬鏁版嵁閫氫俊鐨剆ocket鐨勫皝瑁咃級榪炴帴鍒癆CE_Addr錛堝struct sockaddr鐨勫皝瑁咃級鎻愪緵鎺ュ彛錛屼篃涓嶅惈瀵笰CE_SOCK_Stream瀵硅薄鐨勫叾瀹冩搷浣溿?/p>
宸ュ巶綾籄CE_SOCK_Acceptor鏄竴涓鍔ㄥ垱寤洪氫俊绔殑宸ュ巶綾匯傚綋鐩戝惉鍒版柊鐨勭綉緇滆繛鎺ュ悗錛屼負璇ヨ繛鎺ュ垵濮嬪寲涓涓狝CE_SOCK_Stream瀵硅薄銆傚拰connector涓嶅悓鐨勬槸錛宎cceptor渚濊禆浜庝竴涓凡緇忓瓨鍦ㄧ殑鍏呭綋鐩戝惉鍔熻兘鐨剆ocket鍙ユ焺錛圓CE_SOCK錛夛紝鍥犳錛孉CE_SOCK_Acceptor鏄疉CE_SOCK鐨勪竴涓瓙綾匯?/p>
ACE_SOCK_Stream鏄彧璐熸湁閫氫俊浼犺緭鍔熻兘鐨剆ocket錛屽搴攃onnection-oriented鐨凾CP閫氫俊鏍煎紡stream錛屽拰UDP鐨凜E_SOCK_CODgram鐩稿懠搴斻侫CE_SOCK_Stream鍙槸socket鐨勯氫俊杞戒綋錛屽湪涓や釜宸ュ巶ACE_SOCK_Connector鍜孉CE_SOCK_Acceptor涓垵濮嬪寲銆傝繖鏍蜂竴涓被闄ゆ敮鎸佹渶鍩烘湰鐨勬暟鎹彂閫侊紙send錛夊拰鎺ユ敹錛坮ecv錛夊拰闃誨錛坆locking錛夈侀潪闃誨錛坣onblocking錛夊強瀹氭椂錛坱imed錛夌殑I/O妯″紡澶栵紝榪樻敮鎸佸垎鏁h鍙栵紙scatter-read錛夊拰闆嗕腑鍐欏叆錛坓ather-write錛夈?/p>
瀵逛簬涓涓畝鍗曠殑銆庣綉緇滆紼嬩綔涓氾細鍐欎竴涓湁榪炴帴鐨処M灝忕▼搴忋忥紝涓婇潰榪欎簺鍐呭宸茬粡瓚沖浜嗐傚綋鐒跺嵆浣夸嬌鐢ㄥ搴旂殑鍑犱釜socket API涔熷凡緇忚凍澶熶簡銆備絾鎴戜滑鏄劇劧鏇村姞鍏沖績濡傛搴炲ぇ鐨勪竴涓簱錛屾槸濡備綍瑙e喅澶嶆潅鐨勭綉緇滃簲鐢ㄧ殑錛屾垜灝ゅ叾鍏沖績鐨勬槸澶氱嚎紼嬪茍鍙戝浣曟洿濂界殑澶勭悊銆?/p>
鎵浠ワ紝鎴戝噯澶囪窇鍒扮8銆?绔犱簡銆?/p>
鎴戝彂鐜版垜鏈榪戞垚浜咰ygwin涓嬬殑灝忕櫧榧狅紝鍐欏畬Cygwin涓嬪畨瑁匒CE錛屽啓ACE鍦╟ygwin涓嬬殑浣跨敤銆傜幇鍦ㄥ張鍐?a target="_blank">doxygen銆?/p>
涔嬪墠鎻愬埌鍦–ygwin涓嬭浠g爜鐨勪笉涔犳儻錛屽悗鏉ュ洖鍒癡S涓嬬湅銆傛病榪囧嚑澶╋紝瑙夊緱VS涓嬭繕鏄笉澶熺洿瑙傦紝浜庢槸灝辯洿鎺ョ湅ACE鐨刣oxygen浜?#8230;…
doxygen濂芥槸濂斤紝鐢ㄨ搗鏉ヨ繕鏄鎱㈡參涔犳儻鎵嶈錛岄渶瑕佸湪鍐欐敞閲婂拰浠g爜鐨勬椂鍊欐敞鎰忎竴浜涳紝鎺屾彙鐨勭粏鑺傚拰鎶宸ц秺澶氾紝鍑烘潵鐨勬枃妗h秺涓板瘜錛堝綋鐒訛紝榪欏拰浠g爜璐ㄩ噺鏄袱鐮佷簨錛夈?/p>
鎴戣嚜鐒舵槸鎶奷oxygen瀹夎鍦–ygwin涓嬩簡錛岀敱浜巇oxygen娌℃湁鎻愪緵info錛孖nfo doxygen鏃跺氨鑷姩鎵撳紑浜哾oxygen鐨刴an錛屽拰man doxygen銆乨oxygen --help涓涓晥鏋溿?/p>
濡傛灉甯屾湜闃呰鏇磋灝界殑浣跨敤鏂規硶錛屽彧鏈夎嚜宸?a target="_blank">down涓涓猰anual浜?/a>銆?/p>
鍦–ygwin涓嬶紝doxygen閲囩敤GNU鐨刲ibiconv榪涜鏂囧瓧緙栫爜鐨勮漿鎹紝浠?a target="_blank">UTF-8浣滀負榛樿緙栫爜銆?/p>
浣跨敤doxygen鐢熸垚config-file妯℃澘鍚庯紝鍙互鍦╟onfig-file涓繘琛屼竴浜涢」鐩緗紙鏈夋敞閲婄殑錛岀湅鐨勬噦錛夈?/p>
涓轟簡鏀寔涓枃錛屾垜DOXYFILE_ENCODING鐢ㄧ殑鏄?a target="_blank">EUC-CN錛屼絾杈撳嚭鏂囨。鐨勮璦OUTPUT_LANGUAGE鍗撮変簡English銆備袱鐐瑰師鍥狅細
o EUC-CN錛堝悇縐嶆眽瀛楃紪鐮佺煡璇嗗氨涓嶅湪姝ゆ櫘鍙婁簡錛屼綘鍙互璁や負綆浣撳瓧緙栫爜閮芥槸EUC-CN錛夊拰UTF-8涓嶅悓錛屼絾OUTPUT_LANGUAGE鐨勫悇縐嶈璦閮芥槸浣跨敤鐨刄TF-8錛?span style="text-decoration: line-through;">鎵浠ヤ袱縐嶇紪鐮佷笉鍙兘鍚屾椂鏄劇ず錛屽綋鐒訛紝浣犲彲浠ユ妸EUC-CN鍏ㄨ漿鎴怳TF-8銆傜紪鐮佷笉鏄珮綰х殑鎶鏈紝浣嗗浜庨潪鑻辮鐢ㄦ埛緇濆鏄竴涓櫓姊?/span>錛?span style="color: rgb(34, 34, 34); font-family: Georgia, Arial; font-size: 14px; ">鍚庢潵鍙戠幇鏄垜鑷繁瀛﹁壓涓嶇簿錛孌OXYFILE_ENCODING鍙槸閰嶇疆鏂囦歡鐨勭紪鐮佹牸寮忚屽凡錛岃岃瘑鍒腑鏂囨枃妗e彧闇瑕佷慨鏀笽NPUT_ENCODING鎴怑UC-CN鍗沖彲錛孫UTPUT_LANGUAGE鑷劧璁劇疆鎴怌hinese涔熶笉浼氭湁闂錛屽洜涓篸oxygen閲囩敤UTF-8杈撳嚭錛屼嬌鐢ㄤ腑鏂囪緭鍑轟笉浼氭湁涔辯爜闂銆?/span>
o 铏界劧鎴戠殑鑻辨枃寰堣供鑴氾紝铏界劧鎴戠殑鏂囨。涓鏈変腑鏂囨敞閲娿備絾鍍廳oxygen涓枃杈撳嚭鐨勬枃妗d腑鎶奵lass銆乸ublic閮界粰浣犵炕璇戞垚涓枃錛屼綘涔熷彈涓嶄簡錛岃繖涔熻嫳鏂囨按騫蟲棤鍏熾?/p>
config-file涓殑鍏朵粬鍐呭鎴戠幇鍦ㄤ篃鐢ㄤ笉鍒幫紝灝辨病鏈変粩緇嗙湅銆?/p>
鍥犱負Kevin浼氬湪鍏徃閲岃涓涓媎oxygen錛宒oxygen鐨刴anual涔熻鐨勫緢璇︾粏錛屾垜灝辯渷鐐規椂闂達紝涓嶇炕璇戞枃妗d簡銆?/p>
綆鍗曠殑涓涓?a target="_blank">Doxygen鐨勬祴璇?/a>鍦ㄨ繖閲屻?/p>
鎴戝眻鏈嶄簡錛岃繕鏄疺S鐢ㄧ殑鏂逛究銆?/p>
涔嬪墠鍦–ygwin涓嬪凡緇忓彲浠ヤ嬌鐢ㄧ殑ACE錛屽洜涓洪槄璇諱唬鐮佸お涓嶆柟渚匡紙瀵逛簬涓涓猈inEr鏉ヨ錛夛紝涓婂崍鍦╒S涓嬮潰鑺變簡鍑犲垎閽熷氨鎶夾CE閰嶅ソ浜嗭紝鑰屼笖浣跨敤$(ACE_ROOT)\examples\C++NPv1鐨勪唬鐮佽窡韙皟璇曪紝澶範鎯簡銆?/p>
鎸夌収$(ACE_ROOT)\ACE-INSTALL.html鐨勫畨瑁呰鏄庯細
o 閫夋嫨騫舵墦寮$(ACE_ROOT)\ace\ace_vc9.sln
o 娣誨姞config.h騫跺姞鍏ヤ互涓嬪唴瀹癸細
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
#include "ace/config-win32.h"
o F7
-----------------------------------------------
OK錛岀幇鍦?(ACE_ROOT)\lib涓嬮潰宸茬粡鐢熸垚浜咥CEd.dll銆丄CEd.lib錛屽啀璁劇疆涓涓嬬郴緇熺幆澧冨彉閲忥紙榪愯紼嬪簭蹇呴渶錛夊拰VC++鐩綍錛堣皟璇曠▼搴忓繀闇錛夈傚彲浠ヤ嬌鐢ㄤ簡錛?
o 閫夋嫨騫舵墦寮$(ACE_ROOT)\examples\C++NPv1
o F7
o
int ACE_TMAIN(int, ACE_TCHAR *[]) ACE_DEBUG((LM_INFO, ACE_TEXT("%IStart\n"))); return 0; /*--------- makefile ---------*/ BIN = hello # src & exe file name include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU /*--------- Compilation ---------*/ GNUmakefile: /home/fox/ace/GNUmakefile MAKEFLAGS=k g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe -pipe -I/usr/\ Compilation finished at Wed Aug 19 00:35:42 /*--------- Result ---------*/ $ ./hello.exe
{
ACE_TRACE(ACE_TEXT("main"));
ACE_DEBUG((LM_INFO, ACE_TEXT("%IEnd\n")));
}
SRC = $(addsuffix .cc, $(BIN)) # src file suffix
LIBS = -lACE # libACE.dll under cygwin
include $(ACE_ROOT)/include/makeinclude/macros.GNU
include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE -c -o .obj/hello.o hello.cc
g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe -pipe -I/usr/\
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE -Wl,--enable-auto-import -Wl,-E\
-L/usr/share/ace/lib -o hello .obj/hello.o -lACE
(14417928) calling main in file `hello.cc' on line 13
Start
End
(14417928) leaving main
-------------------------------------------------------
鏇村鍐呭璇峰弬鑰?a target="_blank">C++NP(C++ Network Programming) vol.1 & vol.2鍜孉PG(The ACE Progrmmer's Guide)銆?/p>
蹇欐椿浜嗕竴鏅氫笂錛岀粓浜庣煡閬撴庝箞鍖呭惈澶存枃浠朵簡錛屽湪gcc鐨勭紪璇戦夐」涓敤 -I鎴?I$(ACE_ROOT)錛?/p>
鏈緥涓槸錛?I/usr/share/ace
緇撴灉鍚庨潰搴撳張閾炬帴涓嶄笂錛岃仈鎯充互鍓嶄嬌鐢∣penGL搴撶殑LIBS錛岀粓浜庨潬涓涓?lACE鎼炲畾銆?/p>
鍥犱負涓嶆効鎰忕敤MPC錛屾繪劅瑙夊啀澶氳姳浜涙椂闂村幓寮勫張鍙槸紱婚鏇磋繙浜嗭紝鏈夊叴瓚g殑鍚屽鑷劧鏄彲浠ラ氳繃ACE鐨勫畼緗戞壘鍒版墍鏈夐棶棰樼殑絳旀銆?/p>
榪欐牱涓鏉ワ紝ACE鍦╟ygwin涓嬩粠瀹夎鍒頒嬌鐢ㄤ篃灝卞憡涓孌佃惤浜嗭紝鍚庨潰鐨勯棶棰樺氨姣旇緝easy浜嗭紝鏃犻潪鏄綘鐢ˋCE鍋氫粈涔堛傝屾垜涔熶笉浼氬啀灝盇CE && cygwin鍐欎粈涔堝績寰椾簡錛屾葷畻瑙佽瘉浜嗚繖涓ゅぉ鐨勬崳鑵俱?/p>