锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浠涔堟槸IOCP錛?br>鍏堣鎴戜滑鐪嬬湅瀵笽OCP鐨勮瘎浠?br>I/O瀹屾垚绔彛鍙兘鏄疻in32鎻愪緵鐨勬渶澶嶆潅鐨勫唴鏍稿璞°?br>[Advanced Windows 3rd] Jeffrey Richter IOCP鍜岀綉緇滃張鏈変粈涔堝叧緋伙紵 “鎬庝箞浜?zero 錛熻儍鍙d笉濂戒箞錛?#8221;錛屽熀鏈~楗辮倸瀛愪箣鍚庯紝Solmyr 瑙夊緱浼間箮搴旇鍏沖績涓涓嬩粬鐨勫寰掍簡銆?/p>
“鍛冿紝娌′粈涔堬紝鍙槸 …… Solmyr 錛孋++ 涓轟粈涔堜笉鏀寔鍨冨溇鏀墮泦鍛紵錛堟敞錛氬瀮鍦炬敹闆嗘槸涓縐嶆満鍒訛紝淇濊瘉鍔ㄦ佸垎閰嶄簡鐨勫唴瀛樺潡浼?xì)鑷姩閲婃斁锛孞ava 絳夎璦鏀寔榪欎竴鏈哄埗銆傦級” Solmyr 鍙逛簡鍙f皵錛岀敤涓縐嶅鉤闈欑殑鐪肩鐩潃 zero 錛?#8220;鏄笉鏄湪 BBS 涓婂拰浜哄惖 C++ 鍜?Java 鍝釜鏇村ソ錛熻屼笖鍚佃緭浜嗭紵鎴戞棭鍛婅瘔榪囦綘錛岃繖縐嶄簤璁哄啀鏃犺亰涓嶈繃浜嗐?#8221; “鍛?…… 鏄?#8221;錛寊ero 涓嶅緱涓嶆壙璁?鈥斺斺?Solmyr 鐨勭溂紲炶櫧鐒朵竴鐐逛篃涓嶉攼鍒╋紝浣嗘槸鍗磋帿鍚嶅叾濡欑殑璁?zero 浜х敓浜嗗井寰殑鎭愭儳鎰熴?/p>
“鑰屼笖錛岃皝鍛婅瘔浣?C++ 涓嶆敮鎸佸瀮鍦炬敹闆嗙殑錛?#8221; “鍟婏紒Solmyr 浣犱笉鏄紑鐜╃瑧鍚э紵錛?#8221; “zero 浣犲緱杞彉涓涓嬭蹇點(diǎn)傛垜闂綘錛孋++ 鏀笉鏀寔鍙互鍔ㄦ佹敼鍙樺ぇ灝忕殑鏁扮粍錛?#8221; “榪?…… 濂借薄涔熸病鏈夊惂錛?#8221; “閭?vector 鏄粈涔堜笢瑗匡紵” “鍛?……” “鏀寔涓縐嶇壒鎬э紝騫朵笉鏄闈炲緱鎶婅繖涓壒鎬у姞鍒拌娉曢噷鍘伙紝鎴戜滑涔熷彲浠ラ夋嫨鐢ㄧ幇鏈夌殑璇█鏈哄埗瀹炵幇涓涓簱鏉ユ敮鎸佽繖涓壒寰併備互鍨冨溇鏀墮泦涓轟緥錛岃繖閲屾垜浠殑浠誨姟鏄淇濊瘉姣忎竴涓鍔ㄦ佸垎閰嶇殑鍐呭瓨鍧楅兘鑳藉琚噴鏀撅紝涔熷氨鏄 ……”錛孲olmyr 涓嶇煡浠庡摢閲屾壘鍑轟簡涓寮犵焊銆佷竴鏀瑪錛屽啓鍒幫細(xì) int* p = new int; // 1 “涔熷氨鏄錛屽浜庢瘡涓涓?1 錛屾垜浠淇濊瘉鏈変竴涓?2 琚皟鐢紝1 鍜?2 蹇呴』鎴愬鍑虹幇銆傛垜鏉ラ棶浣狅紝C++ 涓湁浠涔堜笢瑗挎槸鐢辮璦鏈韓淇濊瘉涓瀹氭垚瀵瑰嚭鐜扮殑錛?#8221; “……”錛寊ero 闇插嚭浜嗗姫鍔涙悳绱㈣蹇嗙殑琛ㄦ儏錛屼笉榪囧緢鏄庢樉涓鏃犳墍鑾楓?/p>
“鎻愮ず涓涓嬶紝鍜岀被鐨勫垱寤烘湁鍏熾?#8221; “鍝︼紒鏋勯犲嚱鏁頒笌鏋愭瀯鍑芥暟錛?#8221; “姝g‘銆傚彲鎯滄櫘閫氭寚閽堟病鏈夋瀯閫犲嚱鏁頒笌鏋愭瀯鍑芥暟錛屾墍浠ユ垜浠繀欏昏鍐欎竴涓被鏉ュ姞涓灞傚寘瑁咃紝鏈綆鍗曠殑灝辮薄榪欐牱錛?#8221; class my_intptr my_intptr(int* p){ m_p = p; } ………… my_intptr pi(new int); ………… “榪欓噷鎴戜滑鍙互鏀懼績鐨勪嬌鐢?my_intptr 錛屼笉鐢ㄦ媴蹇冨唴瀛樻硠婕忕殑闂錛氫竴鏃?pi 榪欎釜鍙橀噺琚攢姣侊紝鎴戜滑鐭ラ亾 pi.p 鎸囧悜鐨勫唴瀛樺潡涓瀹氫細(xì)琚噴鏀俱備笉榪囧鏋滄瘡嬈′嬌鐢?my_intptr 閮藉緱鍘昏闂畠鐨勬垚鍛樻湭鍏嶅お楹葷儲浜嗐備負(fù)姝わ紝鍙互緇欒繖涓被鍔犱笂閲嶈澆鐨?* 榪愮畻絎︼細(xì)” class my_intptr public: int& operator*(){ return *m_p; } ………… my_intptr pi; ………… “鐜板湪鏄笉鏄湅璧鋒潵 my_intptr 灝卞儚鏄竴涓湡姝g殑鎸囬拡浜嗭紵姝e洜涓哄姝わ紝榪欑鎶鏈縐頒負(fù)鏅鴻兘鎸囬拡銆傜幇鍦ㄦ垜闂綘錛岃繖涓被榪樼己灝戝摢浜涗笢瑗匡紵” zero 鐨辯潃鐪夊ご錛岀溂鐫涗竴鐪ㄤ竴鐪紝鐪嬩笂鍘誨氨鍍忎竴鍙版參閫熺數(shù)鑴戞鍦ㄨ緵鑻︾殑寰瀹冪殑紜洏涓婃嫹璐濇枃浠躲傝壇涔咃紝zero 鎶搗澶存潵錛屼笉澶‘瀹氱殑璇達(dá)細(xì)“鏄笉鏄繕緙哄皯涓涓嫹璐濇瀯閫犲嚱鏁板拰涓涓祴鍊艱繍綆楃錛?#8221; “璇磋涓轟粈涔堛?#8221;錛孲olmyr 鏄劇劧涓嶆墦綆楀氨榪欐牱鏀捐繃 zero銆?/p>
“鍥犱負(fù) …… 鎴戣寰楁病閿欑殑璇?…… 銆?0 璇?銆嬶紙娉細(xì)鎸囥奅ffective C++ 2/e銆嬩竴涔︼級涓彁鍒拌繃錛屽鏋滀綘鐨勭被閲岄潰鏈夋寚閽堟寚鍚戝姩鎬佸垎閰嶇殑鍐呭瓨錛岄偅涔堜竴瀹氳涓哄畠鍐欎竴涓嫹璐濇瀯閫犲嚱鏁板拰涓涓祴鍊艱繍綆楃 …… 鍥犱負(fù) …… 鍚﹀垯鐨勮瘽錛屼竴鏃︿綘鍋氫簡璧嬪鹼紝浼?xì)瀵艰嚧涓や釜瀵硅薄鐨勬寚閽堟寚鍚戝悓涓鍧楀唴瀛樸傚浜嗭紒濡傛灉鏄笂闈㈢殑綾伙紝榪欐牱涓鏉ヤ細(xì)瀵艱嚧鍚屼竴涓寚閽堣 delete 涓ゆ錛?#8221; “姝g‘銆傞偅涔堟垜浠簲璇ユ庢牱鏉ュ疄鐜板憿錛?#8221; “榪欑畝鍗曪紝鎴戜滑鐢?memcpy 鎶婄洰鏍囨寚閽堟寚鍚戠殑鍐呭瓨涓殑鍐呭鎷瘋礉榪囨潵銆?#8221; “濡傛灉鎴戜滑鐨勬櫤鑳芥寚閽堟寚鍚戜竴涓被鐨勫璞℃庝箞鍔烇紵娉ㄦ剰錛岀被鐨勫璞′腑鍙兘鏈夋寚閽堬紝涓嶈兘鐢?memcpy銆?#8221; “閭?…… 鎴戜滑鐢ㄦ嫹璐濇瀯閫犵殑鍔炴硶銆?#8221; “濡傛灉鎴戜滑鐨勬櫤鑳芥寚閽堟寚鍚戠殑瀵硅薄涓嶈兘鎷瘋礉鏋勯犳庝箞鍔烇紵瀹冨彲鑳芥湁涓涓鏈夌殑鎷瘋礉鏋勯犲嚱鏁般?#8221; “閭?……”錛寊ero 欏夸簡涓欏匡紝鍐沖畾鑰佸疄鎵胯錛?#8220;鎴戜笉鐭ラ亾銆?#8221; “闂鍦ㄥ摢浣犵煡閬撲箞錛熷湪浜庝綘娌℃湁鎶婃櫤鑳芥寚閽堢湅浣滄寚閽堛傛兂璞′竴涓嬶紝濡傛灉鎴戜滑瀵逛竴涓寚閽堝仛璧嬪鹼紝瀹冪殑鍚箟鏄粈涔堬紵” “鍛冿紝鎴戞槑鐧戒簡錛屽湪榪欑鎯呭喌涓嬶紝搴旇鎯沖姙娉曡涓や釜鏅鴻兘鎸囬拡鎸囧悜鍚屼竴涓璞?…… 鍙槸 Solmyr 錛岃繖鏍蜂互鏉ュ矀涓嶆槸浠嶇劧瑕佸鍚屼竴涓璞″垹闄や袱閬嶏紵” “鏄殑錛屾垜浠緱鎯沖姙娉曡В鍐寵繖涓棶棰橈紝鍔炴硶涓嶅彧涓縐嶃傛瘮杈冨ソ鐨勪竴縐嶆槸涓烘瘡涓寚閽堢淮鎶や竴涓紩鐢ㄨ鏁板鹼紝姣忔璧嬪兼垨鑰呮嫹璐濇瀯閫狅紝灝辮璁℃暟鍊煎姞涓錛岃繖鎰忓懗鐫鎸囧悜榪欎釜鍐呭瓨鍧楃殑鏅鴻兘鎸囬拡鍙堝浜嗕竴涓紱鑰屾瘡鏈変竴涓櫤鑳芥寚閽堣閿姣侊紝灝辮璁℃暟鍊煎噺涓錛岃繖鎰忓懗鐫鎸囧悜榪欎釜鍐呭瓨鍧楃殑鏅鴻兘鎸囬拡灝戜簡涓涓紱涓鏃﹁鏁板間負(fù) 0 錛屽氨閲婃斁鍐呭瓨鍧椼傝薄榪欐牱錛?#8221; class my_intptr public: // 鍒濆鍖栬鏁板間負(fù) 1 my_intptr& operator=(const my_intptr& rhs) (*m_count)--; // 璁℃暟鍊煎噺 1 錛屽洜涓鴻鎸囬拡涓嶅啀鎸囧悜鍘熸潵鍐呭瓨鍧椾簡 m_p = rhs.m_p; // 鎸囧悜鍚屼竴鍧楀唴瀛? ………… “鍏朵粬閮ㄥ垎娌℃湁浠涔堝お澶у彉鍖栵紝鎴戜笉璐逛簨浜嗐傜幇鍦ㄦ兂璞′竴涓嬫垜浠庢牱浣跨敤榪欑鏅鴻兘鎸囬拡錛?#8221;錛孲olmyr 鏀句笅浜嗙瑪錛屽啀嬈℃嬁璧蜂簡絳峰瓙錛屾湁浜涙儖鎯滅殑鍙戠幇浠栫埍鍚冪殑鑲変父瀛愬凡緇忓喎浜嗐?/p>
zero 鎯寵薄鐫錛屾湁浜涜繜鐤戙?#8220;鎴戜滑 …… 鍙互鐢?new int 琛ㄨ揪寮忎綔涓烘瀯閫犲嚱鏁扮殑鍙傛暟鏉ユ瀯閫犱竴涓櫤鑳芥寚閽堬紝鐒跺悗 …… 鐒跺悗鎴戜滑鍙互浠繪剰鐨勮祴鍊鹼紝”錛屼粬寮濮嬫姄浣忎簡鎬濊礬錛岃秺璇磋秺蹇紝“浠繪剰鐨勭敤宸茬粡瀛樺湪鐨勬櫤鑳芥寚閽堟潵鏋勯犳柊鐨勬櫤鑳芥寚閽堬紝鏅鴻兘鎸囬拡鐨勮祴鍊艱繍綆楃銆佹嫹璐濇瀯閫犲嚱鏁板拰鏋愭瀯浼?xì)淇濊瘉璁℃暟鍊煎緇堢瓑浜庢寚鍚戣鍐呭瓨鍧楃殑鏅鴻兘鎸囬拡鏁般?#8221;zero 浼間箮鏄庣櫧浜嗕粬鐪嬪埌浜嗘庢牱鐨勫姛鑳斤紝寮濮嬫縺鍔ㄨ搗鏉ワ細(xì)“鐒跺悗涓鏃﹁鏁板間負(fù) 0 琚垎閰嶇殑鍐呭瓨鍧楀氨浼?xì)閲婃斁锛佷篃灏辨槸璇?…… 鏈夋寚閽堟寚鍚戝唴瀛樺潡錛屽畠?yōu)兏嶉噴鏀惧Q屼竴鏃︽病鏈夛紝瀹冨氨鑷姩閲婃斁錛佸お媯掍簡錛佹垜浠彧瑕佷竴寮濮嬫紜殑鍒濆鍖栨櫤鑳芥寚閽堬紝灝卞彲浠ヨ薄鏅氭寚閽堥偅鏍蜂嬌鐢ㄥ畠錛岃屼笖瀹屽叏涓嶇敤鎷呭績鍐呭瓨閲婃斁鐨勯棶棰橈紒澶浜嗭紒”zero 嬋鍔ㄧ殑澶у彨錛?#8220;榪欏氨鏄瀮鍦炬敹闆嗭紒Solmyr 錛佹垜浠湪楗涓婂疄鐜頒簡涓涓瀮鍦炬敹闆嗗櫒錛?#8221; Solmyr 寰堟槑鏄炬病鏈夊垎浜?zero 鐨勬縺鍔細(xì)“鎴戝湪鍚冮キ錛屼綘鑳戒笉鑳戒笉瑕佸ぇ鍙?#8216;楗涓婂疄鐜頒簡涓涓瀮鍦炬敹闆嗗櫒’榪欑鍊掕儍鍙g殑璇濓紵”欏夸簡涓欏匡紝Solmyr 甯︾潃浠栨嫑鐗屽紡鐨勫潖絎戯紝浠ヤ竴縐嶅彲鎭剁殑鍙e惢璇撮亾錛?#8220;鑰屼笖璇鋒敞鎰忎竴涓嬭嚜宸辯殑褰㈣薄銆?#8221; “鍡紵”錛寊ero 鍥炶繃紲炴潵錛屽彂鐜拌嚜宸變笉鐭ヤ粈涔堟椂鍊欑珯浜嗚搗鏉ワ紝鑰屾暣涓鍘呴噷鐨勪漢閮藉湪鐪嬬潃浠栧樋鍢垮伔絎戯紝榪欒浠栨劅瑙夎嚜宸卞儚涓偦鐡溿?/p>
zero 綰㈢潃鑴稿潗涓嬶紝鍘嬩綆浜嗗0闊抽棶 Solmyr 錛?#8220;涓嶈繃 Solmyr 錛岃繖紜疄鏄竴涓殑鍨冨溇鏀墮泦鏈哄埗鍟婏紝鍙鎴戜滑鎶婅繖涓被鏀規(guī)垚 …… 鍡?…… 鏀規(guī)垚妯℃澘綾伙紝璞¤繖鏍鳳細(xì)”zero 鎶撹繃浜嗙焊絎旓紝鍐欏埌錛?/p>
template <typename T> “瀹冧笉灝辮兘鏀寔浠繪剰綾誨瀷鐨勬寚閽堜簡鍚楋紵鎴戜滑灝卞彲浠ユ妸瀹冪敤鍦ㄤ換浣曞湴鏂廣?#8221; Solmyr 鎽囦簡鎽囧ご錛?#8220;涓嶏紝浣犳妸闂鎯崇殑澶畝鍗曚簡銆傚浜庣畝鍗曠殑綾誨瀷錛岃繖涓被紜疄鍙互澶勭悊鐨勫緢濂斤紝浣嗗疄闄呮儏鍐墊槸寰堝鏉傜殑銆傝冭檻涓涓吀鍨嬫儏鍐碉細(xì)綾?Derived 鏄被 Base 鐨勬淳鐢熺被錛屾垜浠笇鏈涜繖鏍瘋祴鍊鹼細(xì)” Base* pb; “浣犲掕璇寸湅錛岃繖縐嶆儏鍐碉紝鎬庢牱鏀圭敤涓婇潰榪欎釜鏅鴻兘鎸囬拡鏉ュ鐞嗭紵” “……”錛寊ero 娌夐粯浜嗐?/p>
“瑕佸疄鐜頒竴涓畬鏁寸殑鍨冨溇鏀墮泦鏈哄埗騫朵笉瀹規(guī)槗錛屽洜涓烘湁璁稿緇嗚妭瑕佽冭檻銆?#8221;錛孲olmyr 寮濮嬫葷粨浜嗭紝“涓嶈繃錛屽熀鏈濊礬灝辨槸涓婇潰璇寸殑榪欎簺銆傚煎緱搴嗗垢鐨勬槸錛岀洰鍓嶅凡緇忔湁浜嗕竴涓浉褰撴垚鐔熺殑‘寮曠敤璁℃暟’鏅鴻兘鎸囬拡錛宐oost::shared_ptr銆傚ぇ澶氭暟鎯呭喌涓嬶紝鎴戜滑閮藉彲浠ヤ嬌鐢ㄥ畠銆傚彟澶栵紝闄や簡鏅鴻兘鎸囬拡涔嬪錛岃繕鏈変竴浜涙妧鏈篃鑳藉甯姪鎴戜滑閬垮紑閲婃斁鍐呭瓨鐨勯棶棰橈紝姣斿鍐呭瓨姹犮備絾鏄紝鍏抽敭鍦ㄤ簬 鈥斺斺?” Solmyr 鍐嶅害鐢ㄩ偅縐嶅鉤闈欑殑鐪肩鐩潃 zero 錛?/p>
“韜負(fù) C/C++ 紼嬪簭鍛橈紝蹇呴』鏈夊垱閫犲姏銆傞偅縐嶈漢鍦ㄨ璦鏈哄埗涓婁笉鎬濊繘鍙栫殑浜猴紝閭g蹇呴』瑕侀潬璇硶寮哄埗鎵嶇煡閬撴庢牱緙栫▼鐨勪漢錛岄偅縐嶆病鏈夊埆浜哄憡璇変粬璇ュ共浠涔堝氨鏃犳墍閫備粠鐨勪漢錛屼笉閫傚悎榪欓棬璇█銆?#8221; 嬈㈣繋璁塊棶姊︽柇閰掗啋鐨勫崥瀹細(xì)http://www.yanzhijun.com 鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ishallwin/archive/2009/09/08/4533145.aspx
鎽樿嚜:http://gzlyb.cnblogs.com/archive/2005/09/30/247049.aspx
嬈㈣繋闃呰姝ょ瘒IOCP鏁欑▼銆傛垜灝嗗厛緇欏嚭IOCP鐨勫畾涔夌劧鍚庣粰鍑哄畠鐨勫疄鐜版柟娉曪紝鏈鍚庡墫鏋愪竴涓狤cho紼嬪簭鏉ヤ負(fù)鎮(zhèn)ㄦ嫧寮IOCP鐨勮皽浜戯紝闄ゅ幓浣犲績涓IOCP鐨勭儲鎭箋侽K錛屼絾鎴戜笉鑳戒繚璇佷綘鏄庣櫧IOCP鐨勪竴鍒囷紝浣嗘垜浼?xì)灏芥垜鏈澶х殑鍔姏銆備互涓嬫槸鎴戜細(xì)鍦ㄨ繖綃囨枃绔犱腑鎻愬埌鐨勭浉鍏蟲妧鏈細(xì)
銆銆I/O绔彛
銆銆鍚屾/寮傛
銆銆鍫靛/闈炲牭濉?br>銆銆鏈嶅姟绔?瀹㈡埛绔?br>銆銆澶氱嚎紼嬬▼搴忚璁?br>銆銆Winsock API 2.0
銆銆鍦ㄨ繖涔嬪墠錛屾垜鏇劇粡寮鍙戣繃涓涓」鐩紝鍏朵腑涓鍧楅渶瑕佺綉緇滄敮鎸侊紝褰撴椂榪樿冭檻鍒頒簡浠g爜鐨勫彲縐繪鎬э紝鍙浣跨敤select,connect,accept,listen,send榪樻湁recv,鍐嶅姞涓婂嚑涓?ifdef鐨勫皝瑁呬互鐢ㄦ潵澶勭悊Winsock鍜孊SD濂楁帴瀛梉socket]涓棿鐨勪笉鍏煎鎬э紝涓涓綉緇滃瓙緋葷粺鍙敤浜嗗嚑涓皬鏃跺緢灝戠殑浠g爜灝卞啓鍑烘潵浜嗭紝鑷充粖榪樿鎴戝緢鍥炲懗銆傞偅浠ュ悗寰堥暱鏃墮棿涔熷氨娌″啀紕頒簡銆?br>銆銆鍓嶄簺鏃ュ瓙錛屾垜浠瓥鍒掑仛涓涓綉緇滄父鎴忥紝鎴戜富鍔ㄦ壙鎷呬笅緗戠粶榪欎竴鍧楋紝鎯蟲兂榪欒繕涓嶆槸灝廲ase,蹇冮噷鍋風(fēng)潃涔愬晩銆傜綉緇滄父鎴忓ソ鍟婏紝緗戠粶娓告垙涓烘垚鐧句笂鍗冪殑鐜╁鎻愪緵浜嗕箰瓚e拰浠や漢鐫縐樼殑娓告垙浣撻獙錛屼粬浠湪綰夸笂浜掔浉鎴樻枟鎴栨槸鍔犲叆闃熶紞鍘繪垬鑳滃叡鍚岀殑鏁屼漢銆傛垜淇″績婊℃弧鐨勫噯澶囧紑鍐欐垜鐨勭綉緇滐紝浜庢槸涔庯紝鍙戠幇榪囧幓鐨勯樆濉炲悓姝ユā寮忔ā寮忔牴鏈笉鑳芥嬁鍒頒竴涓法閲忓鐜╁[MMP]鐨勬灦鏋勪腑鍘伙紝鐩存帴琚惁瀹氭帀浜嗐備簬鏄箮錛屽氨鏈変簡IOCP錛屽鏋滆兘榪囧緢杞繪槗鑰屼婦鐨勬悶鎺侷OCP錛屼篃灝變笉浼?xì)鏈墭q欑瘒鏁欑▼浜嗐備笅闈㈣璇鎬綅璺熼殢鎴戣繘鍏ユ棰樸?/p>
榪欐槸[IOCP]瀹炵幇楂樺閲忕綉緇滄湇鍔″櫒鐨勬渶浣蟲柟娉曘?br>[Windows Sockets2.0:Write Scalable Winsock Apps Using Completion Ports]
Microsoft Corporation
瀹屾垚绔彛妯″瀷鎻愪緵浜嗘渶濂界殑浼哥緝鎬с傝繖涓ā鍨嬮潪甯擱傜敤鏉ュ鐞嗘暟鐧句箖鑷充笂鍗冧釜濂楁帴瀛椼?br>[Windows緗戠粶緙栫▼2nd] Anthony Jones & Jim Ohlund
I/O completion ports鐗瑰埆鏄懼緱閲嶈錛屽洜涓哄畠浠槸鍞竴閫傜敤浜庨珮璐熻澆鏈嶅姟鍣╗蹇呴』鍚屾椂緇存姢璁稿榪炴帴綰胯礬]鐨勪竴涓妧鏈侰ompletion ports鍒╃敤涓浜涚嚎紼嬶紝甯姪騫寵 鐢盜/O璇鋒眰鎵寮曡搗鐨勮礋杞姐傝繖鏍風(fēng)殑鏋舵瀯鐗瑰埆閫傚悎鐢ㄥ湪SMP緋葷粺涓駭鐢熺殑”scalable”鏈嶅姟鍣ㄣ?br>[Win32澶氱嚎紼嬬▼搴忚璁 Jim Beveridge & Robert Wiener
鐪嬫潵鎴戜滑瀹屽叏鏈夌悊鐢辯浉淇OCP鏄ぇ鍨嬬綉緇滄灦鏋勭殑棣栭夈?br>閭OCP鍒板簳鏄粈涔堝憿錛?br>銆銆寰蔣鍦╓insock2涓紩鍏ヤ簡IOCP榪欎竴姒傚康 銆侷OCP鍏ㄧОI/O Completion Port錛屼腑鏂囪瘧涓篒/O瀹屾垚绔彛銆侷OCP鏄竴涓紓姝/O鐨凙PI錛屽畠鍙互楂樻晥鍦板皢I/O浜嬩歡閫氱煡緇欏簲鐢ㄧ▼搴忋備笌浣跨敤select()鎴栨槸鍏跺畠寮傛鏂規(guī)硶涓嶅悓鐨勬槸錛屼竴涓鎺ュ瓧[socket]涓庝竴涓畬鎴愮鍙e叧鑱斾簡璧鋒潵錛岀劧鍚庡氨鍙戶緇繘琛屾甯哥殑Winsock鎿嶄綔浜嗐傜劧鑰岋紝褰撲竴涓簨浠跺彂鐢熺殑鏃跺欙紝姝ゅ畬鎴愮鍙e氨灝嗚鎿嶄綔緋葷粺鍔犲叆涓涓槦鍒椾腑銆傜劧鍚庡簲鐢ㄧ▼搴忓彲浠ュ鏍稿績灞傝繘琛屾煡璇互寰楀埌姝ゅ畬鎴愮鍙c?br>銆銆榪欓噷鎴戣瀵逛笂闈㈢殑涓浜涙蹇電暐浣滆ˉ鍏咃紝鍦ㄨВ閲奫瀹屾垚]涓ゅ瓧涔嬪墠錛屾垜鎯沖厛綆鍗曠殑鎻愪竴涓嬪悓姝ュ拰寮傛榪欎袱涓蹇碉紝閫昏緫涓婃潵璁插仛瀹屼竴浠朵簨鍚庡啀鍘誨仛鍙︿竴浠朵簨灝辨槸鍚屾錛岃屽悓鏃朵竴璧峰仛涓や歡鎴栦袱浠朵互涓婁簨鐨勮瘽灝辨槸寮傛浜嗐備綘涔熷彲浠ユ嬁鍗曠嚎紼嬪拰澶氱嚎紼嬫潵浣滄瘮鍠匯備絾鏄垜浠竴瀹氳灝嗗悓姝ュ拰鍫靛錛屽紓姝ュ拰闈炲牭濉炲尯鍒嗗紑鏉ワ紝鎵璋撶殑鍫靛鍑芥暟璇稿accept(…)錛屽綋璋冪敤姝ゅ嚱鏁板悗錛屾鏃剁嚎紼嬪皢鎸傝搗錛岀洿鍒版搷浣滅郴緇熸潵閫氱煡瀹冿紝”HEY鍏勫紵錛屾湁浜鴻繛榪涙潵浜?#8221;錛岄偅涓寕璧風(fēng)殑綰跨▼灝嗙戶緇繘琛屽伐浣滐紝涔熷氨絎﹀悎”鐢熶駭鑰?娑堣垂鑰?#8221;妯″瀷銆傚牭濉炲拰鍚屾鐪嬩笂鍘繪湁涓ゅ垎鐩鎬技錛屼絾鍗存槸瀹屽叏涓嶅悓鐨勬蹇點(diǎn)傚ぇ瀹墮兘鐭ラ亾I/O璁懼鏄釜鐩稿鎱㈤熺殑璁懼錛屼笉璁烘墦鍗版満錛岃皟鍒惰В璋冨櫒錛岀敋鑷崇‖鐩橈紝涓嶤PU鐩告瘮閮芥槸濂囨參鏃犳瘮鐨勶紝鍧愪笅鏉ョ瓑I/O鐨勫畬鎴愭槸涓浠朵笉鐢氭槑鏅虹殑浜嬫儏錛屾湁鏃跺欐暟鎹殑嫻佸姩鐜囬潪甯告儕浜猴紝鎶婃暟鎹粠浣犵殑鏂囦歡鏈嶅姟鍣ㄤ腑浠thernet閫熷害鎼蛋錛屽叾閫熷害鍙兘楂樿揪姣忕涓鐧句竾瀛楄妭錛屽鏋滀綘灝濊瘯浠庢枃浠舵湇鍔″櫒涓鍙?00KB錛屽湪鐢ㄦ埛鐨勭溂鍏夋潵鐪嬪嚑涔庢槸鐬棿瀹屾垚錛屼絾鏄紝瑕佺煡閬擄紝浣犵殑綰跨▼鎵ц榪欎釜鍛戒護(hù)錛屽凡緇忔氮璐逛簡10涓竴鐧句竾嬈PU鍛ㄦ湡銆傛墍浠ヨ錛屾垜浠竴鑸嬌鐢ㄥ彟涓涓嚎紼嬫潵榪涜I/O銆傞噸鍙營O[overlapped I/O]鏄疻in32鐨勪竴欏規(guī)妧鏈紝浣犲彲浠ヨ姹傛搷浣滅郴緇熶負(fù)浣犱紶閫佹暟鎹紝騫朵笖鍦ㄤ紶閫佸畬姣曟椂閫氱煡浣犮傝繖涔熷氨鏄痆瀹屾垚]鐨勫惈涔夈傝繖欏規(guī)妧鏈嬌浣犵殑紼嬪簭鍦↖/O榪涜榪囩▼涓粛鐒惰兘澶熺戶緇鐞嗕簨鍔°備簨瀹炰笂錛屾搷浣滅郴緇熷唴閮ㄦ鏄互綰跨▼鏉ュ畬鎴恛verlapped I/O銆備綘鍙互鑾峰緱綰跨▼鎵鏈夊埄鐩婏紝鑰屼笉闇瑕佷粯鍑轟粈涔堢棝鑻︾殑浠d環(huán)銆?br>銆銆瀹屾垚绔彛涓墍璋撶殑[绔彛]騫朵笉鏄垜浠湪TCP/IP涓墍鎻愬埌鐨勭鍙o紝鍙互璇存槸瀹屽叏娌℃湁鍏崇郴銆傛垜鍒扮幇鍦ㄤ篃娌℃兂閫氫竴涓狪/O璁懼[I/O Device]鍜岀鍙IOCP涓殑Port]鏈変粈涔堝叧緋匯備及璁¤繖涓鍙d篃榪鋒儜浜嗕笉灝戜漢銆侷OCP鍙笉榪囨槸鐢ㄦ潵榪涜璇誨啓鎿嶄綔錛屽拰鏂囦歡I/O鍊掓槸鏈変簺綾諱技銆傛棦鐒舵槸涓涓鍐欒澶囷紝鎴戜滑鎵鑳借姹傚畠鐨勫彧鏄湪澶勭悊璇諱笌鍐欎笂鐨勯珮鏁堛傚湪鏂囩珷鐨勭涓夐儴鍒嗕綘浼?xì)杞昏屾槗涓劇殑鍙戠幇IOCP璁捐鐨勭湡姝g敤鎰忋?/p>
int main()
{
WSAStartup(MAKEWORD(2, 2), &wsaData);
ListeningSocket = socket(AF_INET, SOCK_STREAM, 0);
bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));
listen(ListeningSocket, 5);
int nlistenAddrLen = sizeof(ClientAddr);
while(TRUE)
{
NewConnection = accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &nlistenAddrLen);
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, (void*) NewConnection, 0, &dwTreadId);
CloseHandle(hThread);
}
return 0;
}
銆銆鐩鎬俊鍙鍐欒繃緗戠粶鐨勬湅鍙嬶紝搴旇瀵硅繖鏍風(fēng)殑緇撴瀯鍦ㄧ啛鎮(zhèn)変笉榪囦簡銆俛ccept鍚庣嚎紼嬭鎸傝搗錛岀瓑寰呬竴涓鎴峰彂鍑鴻姹傦紝鑰屽悗鍒涘緩鏂扮嚎紼嬫潵澶勭悊璇鋒眰銆傚綋鏂扮嚎紼嬪鐞嗗鎴瘋姹傛椂錛岃搗鍒濈殑綰跨▼寰幆鍥炲幓絳夊緟鍙︿竴涓鎴瘋姹傘傚鐞嗗鎴瘋姹傜殑綰跨▼澶勭悊瀹屾瘯鍚庣粓緇撱?br>銆銆鍦ㄤ笂榪扮殑騫跺彂妯″瀷涓紝瀵規(guī)瘡涓鎴瘋姹傞兘鍒涘緩浜嗕竴涓嚎紼嬨傚叾浼樼偣鍦ㄤ簬絳夊緟璇鋒眰鐨勭嚎紼嬪彧闇鍋氬緢灝戠殑宸ヤ綔銆傚ぇ澶氭暟鏃墮棿涓紝璇ョ嚎紼嬪湪浼戠湢[鍥犱負(fù)recv澶勪簬鍫靛鐘舵乚銆?br>銆銆浣嗘槸褰撳茍鍙戞ā鍨嬪簲鐢ㄥ湪鏈嶅姟鍣ㄧ[鍩轟簬Windows NT]錛學(xué)indows NT灝忕粍娉ㄦ剰鍒拌繖浜涘簲鐢ㄧ▼搴忕殑鎬ц兘娌℃湁棰勬枡鐨勯偅涔堥珮銆傜壒鍒殑錛屽鐞嗗緢澶氬悓鏃剁殑瀹㈡埛璇鋒眰鎰忓懗鐫寰堝綰跨▼騫跺彂鍦拌繍琛屽湪緋葷粺涓傚洜涓烘墍鏈夎繖浜涚嚎紼嬮兘鏄彲榪愯鐨刐娌℃湁琚寕璧峰拰絳夊緟鍙戠敓浠涔堜簨]錛孧icrosoft鎰忚瘑鍒癗T鍐呮牳鑺辮垂浜嗗お澶氱殑鏃墮棿鏉ヨ漿鎹㈣繍琛岀嚎紼嬬殑涓婁笅鏂嘯Context]錛岀嚎紼嬪氨娌℃湁寰楀埌寰堝CPU鏃墮棿鏉ュ仛瀹冧滑鐨勫伐浣溿?br>銆銆澶у鍙兘涔熼兘鎰熻鍒板茍琛屾ā鍨嬬殑鐡墮鍦ㄤ簬瀹冧負(fù)姣忎竴涓鎴瘋姹傞兘鍒涘緩浜嗕竴涓柊綰跨▼銆傚垱寤虹嚎紼嬫瘮璧峰垱寤鴻繘紼嬪紑閿瑕佸皬錛屼絾涔熻繙涓嶆槸娌℃湁寮閿鐨勩?br>銆銆鎴戜滑涓嶅Θ璁炬兂涓涓嬶細(xì)濡傛灉浜嬪厛寮濂絅涓嚎紼嬶紝璁╁畠浠湪閭old[鍫靛]錛岀劧鍚庡彲浠ュ皢鎵鏈夌敤鎴風(fēng)殑璇鋒眰閮芥姇閫掑埌涓涓秷鎭槦鍒椾腑鍘匯傜劧鍚庨偅N涓嚎紼嬮愪竴浠庢秷鎭槦鍒椾腑鍘誨彇鍑烘秷鎭茍鍔犱互澶勭悊銆傚氨鍙互閬垮厤閽堝姣忎竴涓敤鎴瘋姹傞兘寮綰跨▼銆備笉浠呭噺灝戜簡綰跨▼鐨勮祫婧愶紝涔熸彁楂樹簡綰跨▼鐨勫埄鐢ㄧ巼銆傜悊璁轟笂寰堜笉閿欙紝浣犳兂鎴戠瓑娉涙硾涔嬭緢閮借兘鎯沖嚭鏉ョ殑闂錛孧icrosoft鍙堟庝細(xì)娌℃湁鑰冭檻鍒板憿 !
銆銆榪欎釜闂鐨勮В鍐蟲柟娉曞氨鏄竴涓О涓篒/O瀹屾垚绔彛鐨勫唴鏍稿璞★紝浠栭嬈″湪Windows NT3.5涓寮曞叆銆?br>銆銆鍏跺疄鎴戜滑涓婇潰鐨勬瀯鎯沖簲璇ュ氨宸笉澶氭槸IOCP鐨勮璁℃満鐞嗐傚叾瀹炶絀夸簡IOCP涓嶅氨鏄竴涓秷鎭槦鍒楀槢錛佷綘璇磋繖鍜孾绔彛]榪欎袱瀛楁湁浣曡仈緋匯傛垜鐨勭悊瑙e氨鏄疘OCP鏈澶氭槸搴旂敤紼嬪簭鍜屾搷浣滅郴緇熸矡閫氱殑涓涓帴鍙g艦浜嗐?br>銆銆鑷充簬IOCP鐨勫叿浣撹璁¢偅鎴戜篃寰堥毦璇村緱涓婃潵錛屾瘯绔熸垜娌$湅榪囧疄鐜扮殑浠g爜錛屼絾浣犲畬鍏ㄥ彲浠ヨ繘琛屾ā鎷燂紝鍙笉榪囨ц兘鍙兘…錛屽鏋滄兂娣卞叆鐞嗚ВIOCP錛?Jeffrey Ritchter鐨凙dvanced Windows 3rd鍏朵腑絎?3绔犲拰絎?4寮犳湁寰堝瀹濊吹鐨勫唴瀹癸紝浣犲彲浠ユ嬁鏉ョ瑙嗕竴涓嬬郴緇熸槸濡備綍瀹屾垚榪欎竴鍒囩殑銆?br>
瀹炵幇鏂規(guī)硶
Microsoft涓篒OCP鎻愪緵浜嗙浉搴旂殑API鍑芥暟錛屼富瑕佺殑灝變袱涓紝鎴戜滑閫愪竴鐨勬潵鐪嬩竴涓嬶細(xì)
HANDLE CreateIoCompletionPort (
HANDLE FileHandle, // handle to file
HANDLE ExistingCompletionPort, // handle to I/O completion port
ULONG_PTR CompletionKey, // completion key
DWORD NumberOfConcurrentThreads // number of threads to execute concurrently
);
鍦ㄨ璁哄悇鍙傛暟涔嬪墠錛岄鍏堣娉ㄦ剰璇ュ嚱鏁板疄闄呯敤浜庝袱涓埅鐒朵笉鍚岀殑鐩殑錛?br>1錛庣敤浜庡垱寤轟竴涓畬鎴愮鍙e璞?br>2錛庡皢涓涓彞鏌刐HANDLE]鍜屽畬鎴愮鍙e叧鑱斿埌涓璧?br>銆銆鍦ㄥ垱寤轟竴涓畬鎴愪竴涓鍙g殑鏃跺欙紝鎴戜滑鍙渶瑕佸~鍐欎竴涓婲umberOfConcurrentThreads榪欎釜鍙傛暟灝卞彲浠ヤ簡銆傚畠鍛婅瘔緋葷粺涓涓畬鎴愮鍙d笂鍚屾椂鍏佽榪愯鐨勭嚎紼嬫渶澶ф暟銆傚湪榛樿鎯呭喌涓嬶紝鎵寮綰跨▼鏁板拰CPU鏁伴噺鐩稿悓錛屼絾緇忛獙緇欐垜浠竴涓叕寮忥細(xì)
銆銆綰跨▼鏁?= CPU鏁?* 2 + 2
瑕佷嬌瀹屾垚绔彛鏈夌敤錛屼綘蹇呴』鎶婂畠鍚屼竴涓垨澶氫釜璁懼鐩稿叧鑱斻傝繖涔熸槸璋冪敤CreateIoCompletionPort瀹屾垚鐨勩備綘瑕佸悜璇ュ嚱鏁頒紶閫掍竴涓凡鏈夌殑瀹屾垚绔彛鐨勫彞鏌勶紝鎴戜滑鏃㈢劧瑕佸鐞嗙綉緇滀簨浠訛紝閭d篃灝辨槸灝嗗鎴風(fēng)殑socket浣滀負(fù)HANDLE浼犺繘鍘匯傚拰涓涓畬鎴愰敭[瀵逛綘鏈夋剰涔夌殑涓涓?2浣嶅鹼紝涔熷氨鏄竴涓寚閽堬紝鎿嶄綔緋葷粺騫朵笉鍏沖績浣犱紶浠涔圿銆傛瘡褰撲綘鍚戠鍙e叧鑱斾竴涓澶囨椂錛岀郴緇熷悜璇ュ畬鎴愮鍙g殑璁懼鍒楄〃涓姞鍏ヤ竴鏉′俊鎭邯褰曘?br>鍙︿竴涓狝PI灝辨槸
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort, // handle to completion port
LPDWORD lpNumberOfBytes, // bytes transferred
PULONG_PTR lpCompletionKey, // file completion key
LPOVERLAPPED *lpOverlapped, // buffer
DWORD dwMilliseconds 銆 // optional timeout value
);
絎竴涓弬鏁版寚鍑轟簡綰跨▼瑕佺洃瑙嗗摢涓涓畬鎴愮鍙c傚緢澶氭湇鍔″簲鐢ㄧ▼搴忓彧鏄嬌鐢ㄤ竴涓狪/O瀹屾垚绔彛錛屾墍鏈夌殑I/O璇鋒眰瀹屾垚浠ュ悗鐨勯氱煡閮藉皢鍙戠粰璇ョ鍙c傜畝鍗曠殑璇達(dá)紝GetQueuedCompletionStatus浣胯皟鐢ㄧ嚎紼嬫寕璧鳳紝鐩村埌鎸囧畾鐨勭鍙g殑I/O瀹屾垚闃熷垪涓嚭鐜頒簡涓欏規(guī)垨鐩村埌瓚呮椂銆傚悓I/O瀹屾垚绔彛鐩稿叧鑱旂殑絎?涓暟鎹粨鏋勬槸浣跨嚎紼嬪緱鍒板畬鎴怚/O欏逛腑鐨勪俊鎭細(xì)浼犺緭鐨勫瓧鑺傛暟錛屽畬鎴愰敭鍜孫VERLAPPED緇撴瀯鐨勫湴鍧銆傝淇℃伅鏄氳繃浼犻掔粰GetQueuedCompletionSatatus鐨刲pdwNumberOfBytesTransferred錛宭pdwCompletionKey鍜宭pOverlapped鍙傛暟榪斿洖緇欑嚎紼嬬殑銆?br>鏍規(guī)嵁鍒扮洰鍓嶄負(fù)姝㈠凡緇忚鍒扮殑涓滆タ錛岄鍏堟潵鏋勫緩涓涓猣rame銆備笅闈負(fù)鎮(zhèn)ㄨ鏄庝簡濡備綍浣跨敤瀹屾垚绔彛鏉ュ紑鍙戜竴涓猠cho鏈嶅姟鍣ㄣ傚ぇ鑷村涓嬶細(xì)
銆銆1.鍒濆鍖朩insock
銆銆2.鍒涘緩涓涓畬鎴愮鍙?br>銆銆3.鏍規(guī)嵁鏈嶅姟鍣ㄧ嚎紼嬫暟鍒涘緩涓瀹氶噺鐨勭嚎紼嬫暟
銆銆4.鍑嗗濂戒竴涓猻ocket榪涜bind鐒跺悗listen
銆銆5.榪涘叆寰幆accept絳夊緟瀹㈡埛璇鋒眰
銆銆6.鍒涘緩涓涓暟鎹粨鏋勫綰硈ocket鍜屽叾浠栫浉鍏充俊鎭?br>銆銆7.灝嗚繛榪涙潵鐨剆ocket鍚屽畬鎴愮鍙g浉鍏寵仈
銆銆8.鎶曢掍竴涓噯澶囨帴鍙楃殑璇鋒眰
浠ュ悗灝變笉鏂殑閲嶅5鑷?鐨勮繃紼?br>閭eソ錛屾垜浠敤鍏蜂綋鐨勪唬鐮佹潵灞曠ず涓涓嬬粏鑺傜殑鎿嶄綔銆?br>銆銆鑷蟲鏂囩珷涔熻鍛婁竴孌佃惤浜?鎴戝甫鐫鎮(zhèn)ㄥ仛浜嗕竴瓚熸棆椋庤埇鐨勬梾娓?娓歌浜嗘墍璋撶殑瀹屾垚绔彛銆?br>
]]>
delete p; // 2
{
public:
int* m_p;
~my_intptr(){ delete m_p; }
};
*(pi.m_p) = 10;
{
private:
int* m_p;
my_intptr(int* p){ m_p = p; }
~my_intptr(){ delete m_p; }
};
*pi = 10;
int a = *pi;
{
private:
int* m_p;
int* m_count;
my_intptr(int* p)
{
m_p = p;
m_count = new int;
*m_count = 1;
}
my_intptr(const my_intptr& rhs) // 鎷瘋礉鏋勯犲嚱鏁?
{
m_p = rhs.m_p; // 鎸囧悜鍚屼竴鍧楀唴瀛?
m_count = rhs.m_count; // 浣跨敤鍚屼竴涓鏁板?
(*m_count)++; // 璁℃暟鍊煎姞 1
}
~my_intptr()
{
(*m_count)--; // 璁℃暟鍊煎噺 1
if( *m_count == 0 ) // 宸茬粡娌℃湁鍒殑鎸囬拡鎸囧悜璇ュ唴瀛樺潡浜?
{
delete m_p;
delete m_count;
}
}
{
if( m_p == rhs.m_p ) // 棣栧厛鍒ゆ柇鏄惁鏈潵灝辨寚鍚戝悓涓鍐呭瓨鍧?
return *this; // 鏄垯鐩存帴榪斿洖
if( *m_count == 0 ) // 宸茬粡娌℃湁鍒殑鎸囬拡鎸囧悜鍘熸潵鍐呭瓨鍧椾簡
{
delete m_p;
delete m_count;
}
m_count = rhs.m_count; // 浣跨敤鍚屼竴涓鏁板?
(*m_count)++; // 璁℃暟鍊煎姞 1
}
};
class my_ptr
{
private:
T* m_p;
int* m_count;
…………
};
Derived pd;
…………
pb = pd;
]]>