锘??xml version="1.0" encoding="utf-8" standalone="yes"?>激情综合中文娱乐网,国产精品制服诱惑,亚洲小视频在线http://www.shnenglu.com/beautykingdom/category/9502.htmlzh-cnThu, 09 Sep 2010 16:05:45 GMTThu, 09 Sep 2010 16:05:45 GMT60鏈夊叧寮傛璇誨啓銆侀氫俊 http://www.shnenglu.com/beautykingdom/archive/2010/09/06/126028.htmlchatlerchatlerMon, 06 Sep 2010 09:33:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/09/06/126028.htmlhttp://www.shnenglu.com/beautykingdom/comments/126028.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/09/06/126028.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/126028.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/126028.html 綆浠?/div>

涓鑸潵璇達紝綆鍗曠殑寮傛錛圓synchronous錛?璋冪敤鏄繖鏍蜂竴縐嶈皟鐢ㄦ柟寮忥細鍙戣搗鑰呰姹備竴涓紓姝ヨ皟鐢紝閫氱煡鎵ц鑰咃紝鐒跺悗澶勭悊鍏朵粬宸ヤ綔錛屽湪鏌愪竴涓悓姝ョ偣絳夊緟鎵ц鑰呯殑瀹屾垚錛涙墽琛岃呮墽琛岃皟鐢ㄧ殑瀹為檯鎿嶄綔錛屽畬鎴愬悗閫?鐭ュ彂璧瘋呫傚彲浠ョ湅鍑猴紝鍦ㄥ紓姝ヨ皟鐢ㄤ腑鏈変袱縐嶈鑹詫細鍙戣搗鑰呭拰鎵ц鑰咃紝瀹冧滑閮芥槸鑳戒富鍔ㄨ繍琛岀殑瀵硅薄錛屾垜浠О涓轟富鍔ㄥ璞★紝鍚屾椂榪樻湁涓涓悓姝ョ偣錛屼富鍔ㄥ璞″湪鍚屾鐐瑰崗璋?鍚屾銆傚湪鏈枃涓紝鎴戜滑璁ㄨ涓昏鏄氱敤璁$畻鏈恒佸榪涚▼澶氱嚎紼嬬殑鍒嗘椂鎿嶄綔緋葷粺涓婄殑寮傛璋冪敤銆傚湪鎿嶄綔緋葷粺鐨勮搴︿笂鏉ョ湅錛屼富鍔ㄥ璞″寘鎷簡榪涚▼銆佺嚎紼嬪拰紜歡涓婄殑IC絳夛紝鑷充簬涓柇錛屽彲浠ョ湅浣滄繪槸鍦ㄦ煇涓繘紼嬫垨鑰呯嚎紼嬬殑涓婁笅鏂囧熺敤涓涓婥PU銆傝屽悓姝ユ搷浣滃彲浠ラ氳繃鎿嶄綔緋葷粺寰楀悇縐嶅悓姝ユ満鍒訛細浜掓枼閿侊紝淇″彿鐏瓑絳夋潵瀹屾垚銆?/div>

鎴戜滑鍙互鍏堢湅鐪嬪紓姝ヨ皟鐢ㄥ湪Windows(鏈枃涓竴鑸笉鍔犳寚鍑虹殑璇濓紝閮芥槸鐗規寚NT/2000)璇誨啓鏂囦歡涓殑搴旂敤銆俉indows涓殑ReadFile鍜學riteFile閮芥彁渚涗簡寮傛鐨勬帴鍙c備互ReadFile涓轟緥錛?/div>

BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);

濡傛灉鏈鍚庝竴涓弬鏁發pOverlapped涓嶄負NULL錛屽茍涓旀枃浠朵互FILE_FLAG_OVERLAPPED 鏍囧織鎵撳紑錛岄偅涔堣繖涓皟鐢ㄥ氨鏄紓姝ョ殑錛歊eadFile浼氱珛鍒昏繑鍥烇紝濡傛灉鎿嶄綔娌℃湁绔嬪埢瀹屾垚錛堣繑鍥濬ALSE騫朵笖GetLastError()榪斿洖 ERROR_IO_PENDING錛夛紝閭d箞璋冪敤鑰呭彲浠ュ湪鏌愪釜鏃跺埢閫氳繃WaitForSingleObject絳夊嚱鏁版潵絳夊緟涓殑hEvent鏉ョ瓑寰呮搷浣滃畬鎴?錛堝彲鑳藉凡緇忓畬鎴愶級榪涜鍚屾錛屽綋鎿嶄綔瀹屾垚浠ュ悗錛屽彲浠ヨ皟鐢℅etOverlappedResult鑰呰幏寰楁搷浣滅殑緇撴灉錛屾瘮濡傛槸鍚︽垚鍔燂紝璇誨彇浜嗗灝戝瓧鑺傜瓑絳夈傝繖閲?鐨勫彂璧瘋呭氨鏄簲鐢ㄧ▼搴忥紝鑰屾墽琛岃呭氨鏄搷浣滅郴緇熸湰韜紝鑷充簬鎵ц鑰呮槸鎬庝箞鎵ц鐨勶紝鎴戜滑浼氬湪鍚庨潰鐨勭瘒騫呰璁恒傝屼袱鑰呯殑鍚屾灝辨槸閫氳繃涓涓猈indows Event鏉ュ畬鎴愩?/div>

鎶婅繖涓紓姝ヨ皟鐢ㄧ殑榪囩▼鍐嶆娊璞″拰鎵╁睍涓浜涳紝鎴戜滑鍙互鎶婂紓姝ヨ皟鐢ㄩ渶瑕佽В鍐崇殑闂褰掔粨涓轟袱涓細涓涓槸鎵ц鐨勫姩鍔涳紝鍙︿竴涓槸涓誨姩瀵硅薄鐨勮皟搴︺傜畝鍗曟潵璇達紝鍓嶈呮槸鍚勪釜涓誨姩瀵硅薄錛堢嚎紼嬨佽繘紼嬫垨鑰呬竴浜涗唬鐮侊級鏄浣曡幏寰桟PU錛屽悗鑰呮槸鍚勪釜涓誨姩瀵硅薄濡備綍鍗忓悓宸ヤ綔錛?淇濊瘉鎿嶄綔鐨勬祦紼嬫槸鍗忚皟姝g‘鐨勩備竴鑸潵璇達紝榪涚▼鍜岀嚎紼嬮兘鍙互鐢辨搷浣滅郴緇熺洿鎺ヨ皟搴﹁岃幏寰桟PU錛岃屾洿緇嗙矑搴︾殑錛屾瘮濡備竴浜涗唬鐮佺殑璋冨害錛屽線寰灝遍渶瑕佷竴涓洿澶嶆潅鐨勬ā 鍨嬶紙姣斿鍦ㄦ搷浣滅郴緇熷唴閮ㄧ殑瀹炵幇錛岃繖鏃跺欑嚎紼嬬殑綺掑害澶矖浜嗭級銆傝屼富鍔ㄥ璞$殑璋冨害錛屽綋鍙備笌鑰呰緝灝戠殑鏃跺欙紝鍙互閫氳繃鍩烘湰鐨勫悓姝ユ満鍒舵潵瀹屾垚錛屽湪鏇村鏉傜殑鎯呭喌涓嬶紝鍙?鑳介氳繃涓涓猻chedule鏈哄埗鏉ュ仛浼氭洿瀹為檯涓浜涖?/div>

鍔ㄥ姏鍜岃皟搴?/div>

濡傚墠鎵榪幫紝寮傛璋冪敤涓昏闇瑕佽В鍐充袱 涓棶棰橈細鎵ц鐨勫姩鍔涘拰鎵ц鐨勮皟搴︺傛渶鏅亶鐨勬儏鍐靛氨鏄紝涓涓富瀵兼祦紼嬬殑璋冪敤鑰呰繘紼嬶紙綰跨▼錛夛紝涓涓垨澶氫釜宸ヤ綔鑰呰繘紼嬶紙綰跨▼錛夛紝閫氳繃鎿嶄綔緋葷粺鎻愪緵鐨勫悓姝ユ満鍒舵潵瀹?鎴愬紓姝ヨ皟鐢ㄣ傝繖涓悓姝ユ満鍒跺湪鎵╁睍鍖栫殑鎯呭艦涓嬶紝鏄竴涓垨澶氫釜鏍呮爮Barrier錛屽搴斾簬姣忎釜鍚屾鐨勬墽琛岀偣銆傛墍鏈夐渶瑕佸湪榪欎釜鎵ц鐐瑰悓姝ョ殑涓誨姩瀵硅薄浼氱瓑寰呯浉搴旂殑 Barrier錛岀洿鍒版墍鏈夊璞¢兘瀹屾垚銆傚湪涓浜涚畝鍖栫殑鎯呭艦錛屾瘮濡傝宸ヤ綔鑰呭茍涓嶅叧蹇冭皟鐢ㄨ呯殑鍚屾錛岄偅涔堣繖涓狟arrier鍙互綆鍖栨垚淇″彿鐏紝鍦ㄥ彧鏈変竴涓伐浣滆?鐨勬儏鍐典笅錛屽彲浠ョ畝鍖栨垚涓涓猈indows浜嬩歡Event鎴栬呮潯浠跺彉閲?Condition Variable銆?/div>

鐜板湪鏉ヨ冭檻澶嶆潅鐨勬儏 褰€傚亣璁炬垜浠敤涓浜涚嚎紼嬫潵鍗忎綔瀹屾垚涓欏瑰伐浣滐紝鍚勪釜綰跨▼鐨勬墽琛屼箣闂存湁鍏堝悗欏哄簭涓婄殑闄愬埗錛岃屾搷浣滅郴緇熷氨鏄繖欏瑰伐浣滅殑璋冨害鑰咃紝璐熻矗鍦ㄩ傚綋鐨勬椂鍊欒皟搴﹂傚綋鐨勭嚎紼嬫潵 鑾峰緱CPU銆傛樉鐒訛紝騫跺彂鎵ц涓殑涓涓嚎紼嬪浜庡彟澶栦竴涓嚎紼嬫潵璇達紝鏈川涓婂氨鏄紓姝ョ殑錛屽亣濡傚畠浠箣闂存湁璋冪敤鍏崇郴錛岄偅涔熷氨鏄竴涓紓姝ヨ皟鐢ㄣ傝屾搷浣滅郴緇熷彲浠ラ氳繃鍩?鏈殑鍚屾鏈哄埗浣垮緱鍚堥傜殑綰跨▼鎵嶈璋冨害錛屽叾浠栨湭瀹屾垚鐨勭嚎紼嬪垯澶勪簬絳夊緟鐘舵併備婦渚嬭錛屾垜浠湁4涓嚎紼婣,B,C,D鏉ュ畬鎴愪竴欏瑰伐浣滐紝鍏朵腑鐨勯『搴忛檺鍒舵槸 A>B;C>D錛?#8220;>”琛ㄧず宸﹁竟鐨勭嚎紼嬪畬鎴愬繀欏誨厛浜庡彸杈圭殑綰跨▼鎵ц錛岃?#8220;;”琛ㄧず涓や釜綰跨▼鍙互鍚屾椂榪涜銆傚悓鏃跺亣璁綛鐨勪竴涓搷浣滈渶瑕佽皟鐢?C鏉ュ畬鎴愶紝鏄捐屾槗瑙侊紝榪欐椂鍊欒繖涓搷浣滃氨鏄竴涓紓姝ヨ皟鐢ㄣ傛垜浠彲浠ュ湪姣忎釜“>”鐨勪綅緗瀹氫竴涓悓姝ョ偣錛岀劧鍚庨氳繃涓涓俊鍙風伅鏉ュ畬鎴愬悓姝ャ傜嚎紼婤錛孋絳夊緟 絎竴涓俊鍙風伅錛岃孌浼氱瓑寰呯浜屼釜淇″彿鐏傝繖涓緥瀛愮殑鍔ㄥ姏鍜岃皟搴﹂兘鏄氳繃鎿嶄綔緋葷粺鐨勫熀鏈満鍒訛紙綰跨▼璋冨害鍜屽悓姝ユ満鍒訛級鏉ュ畬鎴愩?/div>

鎶婅繖涓繃紼嬫娊璞′竴涓嬶紝鍙互鎻忚堪涓猴細鑻ュ共涓富鍔ㄥ璞★紙鍖呮嫭浠g爜錛夊崗璋冩潵瀹屾垚涓欏瑰伐浣滐紝閫氳繃涓涓皟搴﹀櫒鏉ヨ皟搴︼紝瀹為檯涓婏紝榪欎釜璋冨害鍣ㄥ彲鑳藉彧鏄竴浜涜皟搴﹁鍒欍傛樉 鐒訛紝榪涚▼鎴栬呯嚎紼嬪彧瑕佽璋冨害灝辮兘鑾峰緱CPU錛屾墍浠ユ垜浠富瑕佽冭檻浠g爜錛堟瘮濡備竴涓嚱鏁幫級鎬庝箞鏍鋒墠鑳借幏寰楁墽琛屻傜敤宸ヤ綔鑰呯嚎紼嬫潵璋冪敤榪欎釜鍑芥暟鏄劇劧鏄洿瑙傚拰閫氱敤鐨勪竴 涓柟妗堛備簨瀹炰笂錛屽湪鐢ㄦ埛絀洪棿(user space)鎴栬呯敤鎴鋒?user mode)錛岃繖涓柟娉曟槸寰堝父鐢ㄧ殑銆傝屽湪鍐呮牳鎬?kernel mode)錛屽垯鍙互閫氳繃涓柇鏉ヨ幏寰桟PU錛岃繖涓氳繃娉ㄥ唽IDT鍏?鍙e拰瑙﹀彂杞腑鏂氨鍙互瀹屾垚銆傜‖浠惰澶囦笂鐨処C鏄彟涓涓姩鍔涗箣婧愩傝屼富鍔ㄥ璞$殑璋冨害錛屾渶鍩烘湰鐨勪篃鏄墠闈㈣鐨勫悇縐嶅悓姝ユ満鍒躲傚彟涓涓父鐢ㄧ殑鏈哄埗灝辨槸鍥炶皟鍑芥暟錛岄渶 瑕佹敞鎰忕殑鏄紝鍥炶皟鍑芥暟涓鑸細鍙戠敓鍦ㄨ窡璋冪敤鑰呬笉涓鏍風殑涓婁笅鏂囷紝姣斿璇村悓涓涓繘紼嬬殑涓嶅悓綰跨▼錛岃繖涓樊鍒細甯︽潵涓浜涢檺鍒躲傚鏋滈渶瑕佸洖璋冨彂鐢熷湪璋冪敤鑰呯殑榪涚▼錛堢嚎 紼嬶級涓婁笅鏂囷紝鍒欓渶瑕佷竴浜涚被浼糢nix涓嬬殑signal鎴栬匴indows涓嬬殑APC鏈哄埗錛岃繖涓鐐規垜浠湪鍚庨潰浼氭湁鎵闃愯堪銆傞偅涔堝湪鍥炶皟鍑芥暟閲岄潰涓鑸綔浜涗粈涔堜簨鎯呭憿錛熸渶甯哥敤鐨勶紝 璺熷悓姝ユ満鍒剁粨鍚堝湪涓璧鳳紝褰撶劧灝辨槸閲婃斁涓涓簰鏂ラ攣錛屼俊鍙風伅鎴栬匴indows Event錛圲nix鐨勬潯浠跺彉閲忥級絳夌瓑錛屼粠鑰屼嬌寰楃瓑寰呭悓姝ョ殑鍏朵粬瀵硅薄鍙互寰楀埌璋冨害鑰岄噸鏂版墽琛岋紝瀹為檯涓婏紝涔熷彲浠ョ湅浣滄槸閫氱煡璋冨害鍣紙鎿嶄綔緋葷粺錛夋煇浜涗富鍔ㄥ璞?錛堢瓑寰呭悓姝ョ殑錛夊彲浠ラ噸鏂拌璋冨害浜嗭紝浠庤岃皟搴﹀櫒閲嶆柊璋冨害銆備絾鏄浜庡彟澶栦竴浜涜皟搴﹀櫒錛屽湪榪欎釜榪囩▼涓彲鑳戒笉闇瑕佸悓姝ュ璞$殑鍙備笌銆傚湪涓浜涙瀬绔竴浜涚殑渚嬪瓙閲岋紝璋冨害鐢?鑷充笉瑕佹眰涓ユ牸鏈夊簭鐨勩?/div>

鍦ㄥ疄闄呭簲鐢ㄤ腑錛屾牴鎹幆澧冪殑闄愬埗錛屽紓姝ヨ皟鐢ㄧ殑鍔ㄥ姏鍜岃皟搴︾殑瀹炵幇鏂瑰紡鍙互鏈夊緢澶у樊鍒傛垜浠細鍦ㄥ悗闈㈢殑渚嬪瓙閲屽姞浠ヨ鏄庛?鎿嶄綔緋葷粺涓殑寮傛錛歐indows鐨勫紓姝/O銆?/div>

Windows NT/2000鏄竴涓姠鍗犲紡鐨勫垎鏃舵搷浣滅郴緇熴俉indows鐨勮皟搴﹀崟浣嶆槸綰跨▼錛屽畠鐨?I/O鏋舵瀯鏄畬鍏ㄥ紓姝ョ殑錛屼篃灝辨槸璇村悓姝ョ殑I/O瀹為檯涓婇兘鍩轟簬寮傛I/O鏉ュ畬鎴愩備竴涓敤鎴鋒佺殑綰跨▼璇鋒眰涓涓狪/O鐨勬椂鍊欎細瀵艱嚧涓涓繍琛岀姸鎬佷粠user mode鍒発ernel mode鐨勮漿鍙橈紙鎿嶄綔緋葷粺鎶婂唴鏍告槧灝勫埌姣忎釜榪涚▼鐨?G-4G鐨勫湴鍧涓婏紝瀵逛簬姣忎釜榪涚▼閮芥槸涓鏍風殑錛夈傝繖涓繃紼嬫槸閫氳繃涓柇璋冪敤鍐呮牳杈撳嚭鐨勪竴浜汼ystem Service鏉ュ畬鎴愶紝姣斿璇碦eadFile瀹為檯涓婁細鎵цNtReadFile錛圸wReadFile錛夛紝闇瑕佹敞鎰忕殑鏄紝榪愯涓婁笅鏂囦粛鐒舵槸褰撳墠綰跨▼銆?NtReadFile鐨勫疄鐜板垯鍩轟簬Windows鍐呮牳鐨勫紓姝/O妗嗘灦錛屽湪I/O Manager鐨勫崗鍔╀笅瀹屾垚銆傞渶瑕佹寚鍑虹殑鏄紝I/O Manager鍙槸鐢辮嫢騫睞PI鏋勬垚鐨勪竴涓娊璞℃蹇碉紝騫舵病鏈変竴涓湡姝g殑I/O Manager綰跨▼鍦ㄨ繍琛屻?/div>

Windows鐨処/O椹卞姩紼嬪簭鏄眰嬈″爢縐殑銆傛瘡涓┍鍔ㄧ▼搴忎細鎻愪緵涓鑷寸殑鎺ュ彛浠ヤ緵鍒濆鍖栥佹竻鐞嗗拰鍔熻兘璋冪敤銆傞┍鍔ㄧ▼搴忕殑璋冪敤鍩轟簬I/O璇鋒眰鍖咃紙I/O Request Packet, IRP錛夛紝鑰屼笉鏄儚鏅氱殑鍑芥暟璋冪敤閭f牱浣跨敤鏍堟潵浼犻掑弬鏁般傛搷浣滅郴緇熷拰PnP綆$悊鍣ㄦ牴鎹敞鍐岃〃鍦?閫傚綋鐨勬椂鏈哄垵濮嬪寲鍜屾竻鐞嗙浉搴旂殑椹卞姩紼嬪簭銆傚湪涓鑸殑鍔熻兘璋冪敤鐨勬椂鍊欙紝IRP閲岄潰浼氭寚瀹氬姛鑳借皟鐢ㄥ彿鐮佷互鍙婄浉搴旂殑涓婁笅鏂囨垨鑰呭弬鏁幫紙I/O stack location錛夈備竴涓┍鍔ㄧ▼搴忓彲鑳借皟鐢ㄥ埆鐨勯┍鍔ㄧ▼搴忥紝榪欎釜榪囩▼鍙兘鏄悓姝ョ殑錛堢嚎紼嬩笂涓嬫枃涓嶆敼鍙?錛屼篃鍙兘鏄紓姝ョ殑銆侼tReadFile鐨勫疄鐜幫紝澶ц嚧 鏄悜鏈涓婂眰鐨勯┍鍔ㄧ▼搴忓彂鍑轟竴涓垨澶氫釜IRP錛岀劧鍚庣瓑寰呯浉搴斾簨浠剁殑瀹屾垚錛堝悓姝ョ殑鎯呭喌錛夛紝鎴栬呯洿鎺ヨ繑鍥烇紙甯verlapped鐨勬儏鍐碉級錛岃繖浜涢兘鍦ㄥ彂璧瘋姹傜殑 綰跨▼鎵ц銆?/div>

褰撻┍鍔ㄧ▼搴忓鐞咺RP鐨勬椂鍊欙紝瀹冨彲鑳界珛鍒誨畬鎴愶紝涔熷彲鑳藉湪涓柇閲屾墠鑳藉畬鎴愶紝姣斿璇達紝寰紜歡璁懼鍙戝嚭涓涓姹傦紙閫氬父鍙互鏄啓 I/O port錛夛紝褰撹澶囧畬鎴愭搷浣滅殑鏃跺欎細瑙﹀彂涓涓腑鏂紝鐒跺悗鍦ㄤ腑鏂鐞嗗嚱鏁伴噷寰楀埌鎿嶄綔緇撴灉銆俉indows鏈変袱綾諱腑鏂紝紜歡璁懼鐨勪腑鏂拰杞腑鏂紝鍒嗘垚鑻ュ共涓笉 鍚岀殑浼樺厛綰э紙IRQL錛夈傝蔣涓柇涓昏鏈変袱縐嶏細DPC(Delayed Procedure Call)鍜孉PC(Asynchronous Procedure Call)錛岄兘澶勪簬杈冧綆鐨勪紭鍏堢駭銆傞┍鍔ㄧ▼搴忓彲浠ヤ負紜歡涓柇娉ㄥ唽ISR(Interrupt Service Routine)錛屼竴鑸氨鏄慨鏀笽DT鏌愪釜鏉$洰鐨勫叆鍙c傚悓鏍鳳紝鎿嶄綔緋葷粺涔熶細涓篋PC鍜孉PC娉ㄥ唽閫傚綋鐨勪腑鏂鐞嗕緥紼嬶紙涔熸槸鍦↖DT涓級銆?/div>

鍊煎緱鎸囧嚭鐨勬槸錛孌PC鏄窡澶勭悊鍣ㄧ浉鍏崇殑錛屾瘡涓鐞嗗櫒浼氭湁涓涓狣PC闃熷垪錛岃孉PC鏄窡綰跨▼鐩稿叧鐨勶紝姣忎釜綰跨▼浼氭湁瀹冪殑APC闃熷垪錛堝疄闄呬笂鍖呮嫭涓涓?Kernel APC闃熷垪鍜孶ser APC闃熷垪錛屽畠浠殑璋冨害絳栫暐鏈夋墍鍖哄埆錛夛紝鍙互鎯寵薄錛孉PC騫朵笉綆椾弗鏍兼剰涔変笂鐨勪腑鏂紝鍥犱負涓柇鍙兘鍙戠敓鍦ㄤ換浣曚竴涓嚎紼嬬殑涓婁笅鏂囦腑錛屽畠琚О涓轟腑鏂紝涓昏鏄洜涓?IRQL鐨勬彁鍗囷紙浠嶱ASSIVE鍒癆PC錛夛紝APC鐨勮皟搴︿竴鑸湪綰跨▼鍒囨崲絳夌瓑鎯呭艦涓嬭繘琛屻傚綋涓柇鍙戠敓鐨勬椂鍊欙紝鎿嶄綔緋葷粺浼氳皟鐢ㄤ腑鏂鐞嗕緥紼嬶紝瀵逛簬紜歡璁懼 鐨処SR錛屼竴鑸鐞嗘槸鍏寵澶囦腑鏂紝鍙戝嚭涓涓狣PC璇鋒眰錛岀劧鍚庤繑鍥炪備笉鍦ㄨ澶囩殑涓柇澶勭悊涓嬌鐢ㄥお澶氱殑CPU鏃墮棿錛屼富瑕佽冭檻鏄惁鍒欏彲鑳戒涪澶卞埆 鐨勪腑鏂傜敱浜庣‖浠惰澶囦腑鏂殑IRQL姣擠PC涓柇鐨勯珮錛屾墍浠ュ湪ISR閲岄潰DPC浼氶樆濉烇紝鐩村埌ISR榪斿洖IRQL鍥炲埌杈冧綆鐨勬按騫籌紝鎵嶄細瑙﹀彂DPC涓柇錛屽湪 DPC涓柇閲屾墽琛屼粠紜歡璁懼璇誨彇鏁版嵁浠ュ強閲嶆柊璇鋒眰銆佸紑涓柇絳夋搷浣溿侷SR鎴栬匘PC鍙兘鍦ㄤ換浣曡涓柇鐨勭嚎紼嬩笂涓嬫枃錛坅rbitrary thread context錛夋墽琛岋紝浜嬪疄涓婄嚎紼嬬殑涓婁笅鏂囨槸涓嶅彲瑙佺殑錛屽彲浠ヨ涓烘槸緋葷粺鍊熺敤涓涓嬫椂闂寸墖鑰屽凡銆?/div>

鎬葷殑鏉ヨ錛學indows鐨勫紓姝/O鏋?鏋勪腑錛屼富瑕佹湁涓ょ鍔ㄥ姏錛屼竴鏄彂璧瘋姹傜殑綰跨▼錛屼竴閮ㄥ垎鍐呮牳浠g爜浼氬湪榪欎釜綰跨▼涓婁笅鏂囨墽琛岋紝浜屾槸ISR鍜孌PC錛岃繖閮ㄥ垎鍐呮牳浠g爜浼氬湪涓柇閲屽畬鎴愶紝鍙兘浣跨敤浠諱綍涓 涓嚎紼嬬殑涓婁笅鏂囥傝岃皟搴﹀父瑙佷嬌鐢ㄥ洖璋冨拰浜嬩歡錛圞EVENT錛夛紝姣斿璇村湪寰涓嬩竴灞傜殑椹卞姩紼嬪簭鍙戝嚭璇鋒眰鐨勬椂鍊欙紝鍙互鎸囧畾涓涓畬鎴愪緥紼婥ompletion Routine錛屽綋涓嬪眰鐨勯┍鍔ㄥ畬鎴愯繖涓姹傜殑鏃跺欎細璋冪敤榪欎釜渚嬬▼錛岃屽線寰鍦ㄨ繖涓緥紼嬮噷錛屽氨鏄畝鍗曠殑瑙﹀彂涓涓嬩竴涓簨浠躲?鍙﹀鍙互欏轟究鎻愪竴涓婰inux銆侺inux 2.6涔熸湁綾諱技鐨勪腑鏂満鍒訛紝瀹冩湁鏇村鐨勮蔣涓柇浼樺厛綰э紝鍗充笉鍚屼紭鍏堢駭鐨剆oftirq錛岃岀被浼間簬DPC錛孡inux涔熸彁渚涗簡涓撻棬鐨勮蔣涓柇錛屽搴擠PC鐨勫氨鏄?tasklet銆侺inux娌℃湁涓涓儚windows榪欎箞涓鑷寸殑灞傛椹卞姩紼嬪簭鏋舵瀯錛屾墍浠ュ畠鐨勫紓姝/O紼嶅井綺楃硻涓浜涳紝涓昏鏄氳繃浠ュ墠鐨勪竴浜涢樆濉炵偣錛岀幇鍦ㄧ洿 鎺ヨ繑鍥?EIOCBRETRY錛岃岃璋冪敤鑰呭湪鍚堥傜殑鏃舵満緇х畫閲嶈瘯銆傚湪榪欎釜鏂規硶涓紝鍙互璁や負鏁翠釜鎿嶄綔鐢變竴涓嚱鏁板畬鎴愶紝姣忔鎿嶄綔鏈夎繘灞曟椂錛岄兘鎶婅繖涓嚱鏁頒粠澶存墽 琛屼竴閬嶏紝褰撶劧宸茬粡瀹屾垚鐨勯儴鍒嗗氨涓嶄細鍐嶆湁瀹為檯鐨処/O銆傝繖鏍風殑鏈澶уソ澶勬槸鍘熸湁鐨勬枃浠剁郴緇熷拰椹卞姩紼嬪簭涓嶇敤瀹屽叏閲嶅啓銆傝屽浜庡悓姝ヨ皟鐢紝鍙闃誨灝卞彲浠ヤ簡錛岃繖鏍峰 緋葷粺鐨勪慨鏀硅緝灝忋傝繖鏃跺欙紝瑕佹彁渚汸OSIX aio鐨勮涔夛紝灝卞彲鑳介渶瑕佹彁渚涗竴浜涚敤鎴風嚎紼嬫潵瀹屾垚閲嶈瘯鐨勮繃紼嬩簡錛堝洖鎯砏indows鍙互閫氳繃涓柇鍜孌PC瀹屾垚鐨勶級銆傝屽浜嶴olaris錛屼篃鏄被浼肩殑澶勭悊錛屽鏋滆澶囨敮鎸佸紓姝/O錛岄偅灝遍氳繃涓柇鍙互瀹屾垚錛屽惁鍒欏氨浣跨敤鍐呴儴鐨凩WP鏉ユā鎷熴?/div>
搴旂敤紼嬪簭錛氫竴涓紓姝ョ殑HTTP鏈嶅姟鍣ㄧ殑璁捐

鍋囪鎴戜滑瑕佽璁′竴涓狧TTP鏈嶅姟鍣紝瀹冪殑璁捐鐩爣鍖呮嫭錛氶珮騫跺彂鎬с佺簿綆 錛堥儴鍒嗘敮鎸丠TTP/1.1錛夈佹敮鎸乸lug-in緇撴瀯銆傚湪涓嶅皯鍦哄悎鍙兘閮芥湁榪欎釜闇姹傘傛諱綋涓婃潵璇達紝HTTP鏈嶅姟鍣ㄥ彲浠ョ被姣旀垚涓涓熀浜庡綰跨▼鐨勬搷浣滅郴 緇燂細OS璋冨害姣忎釜宸ヤ綔綰跨▼鍦ㄩ傚綋鐨勬椂鍊欒幏寰楁墽琛岋紝鑰屽伐浣滅嚎紼嬫彁渚涙湇鍔★紙涔熷氨鏄鐞咹TTP璇鋒眰錛夈傚湪榪欎釜鍩虹涓婏紝涓昏鐨勮冭檻灝辨槸璋冨害綺掑害鐨勫ぇ灝忥紝綺掑害澶ぇ 鐨勬椂鍊欏茍鍙戞т細闄嶄綆錛岃岀矑搴﹀お灝忓張鍙兘鍥犱負浠誨姟鍒囨崲錛堣冭檻OS鐨凜ontext Switching錛夎屽鑷存晥鐜囬檷浣庯紝鎵浠ヨ繖鍙堟槸涓涓姌琛風殑緇撴灉銆傜被浼間簬Apache錛堜互鍙婂叾浠栫殑HTTP鏈嶅姟鍣級錛屾垜浠彲浠ユ妸涓涓狧TTP澶勭悊榪囩▼鍒嗕負 鑻ュ共涓姸鎬侊紝鍩轟簬榪欎簺鐘舵佸彲浠ユ瀯閫犲嚭涓涓狧TTP澶勭悊鐨勭姸鎬佹満銆傝繖縐嶆儏鍐典笅錛屾垜浠氨鍙互鎶婃瘡涓姸鎬佺殑澶勭悊浣滀負璋冨害鐨勭矑搴︺備竴涓皟搴﹁繃紼嬪氨鏄細涓涓伐浣滅嚎紼?浠庡叏灞鐨勪換鍔¢槦鍒楅噷鍙栧嚭涓涓狧TTP_Context緇撴瀯錛涙牴鎹綋鍓嶇殑鐘舵佸畬鎴愮浉搴斿鐞嗭紱鐒跺悗鏍規嵁鐘舵佹満璁劇疆涓嬩竴涓姸鎬侊紱鍐嶆斁鍥炲埌鍏ㄥ眬鐨勪換鍔¢槦鍒楅噷銆傝繖鏍?瀛愶紝鑻ュ共涓狧TTP鐘舵佸氨鍙互閫氳繃榪欎釜璋冨害絳栫暐鏋勬垚涓涓畬鏁碒TTP澶勭悊榪囩▼銆傛樉鑰屾槗瑙侊紝涓涓姸鎬佸浜庝笅涓涓姸鎬佸鐞嗙殑璋冪敤閮藉彲浠ヨ涓烘槸寮傛鐨勩備竴涓?HTTP鐘舵佹満鐨勮璁″涓嬪浘鎵紺恒?/div>

銆銆銆銆
鍥?. HTTP鐘舵佹満

宸ヤ綔綰跨▼鐨勫嚱鏁板叾瀹炲氨鏄袱涓搷浣滐細浠庣姸鎬侀槦鍒楅噷鍙栧嚭涓涓狧TTP_Context錛岃皟鐢℉TTP_Context鐨剆ervice()鍑芥暟錛屽懆鑰屽姝ゃ?鍦ㄨ繖涓灦鏋勪笂錛屽氨寰堝鏄撳紩鍏ュ紓姝/O鍜孭lug-in鐨勬満鍒朵簡銆備簨瀹炰笂鎴戜滑涔熷彲浠ヤ嬌鐢ㄥ熀浜庝簨浠訛紙渚嬪select/poll錛夌殑I/O絳栫暐鏉ユā鎷熷紓姝 /O錛屽疄鐜頒腑浣跨敤涓涓敤鎴風嚎紼嬪氨鍙互浜嗐?/div>

瀵逛簬寮傛I/O鍜孭lug-in鐨勮皟鐢紝鎴戜滑涔熸槸閲囩敤綾諱技浜嶭inux 2.6閲岄潰aio鐨勯噸璇曟柟妗堬紝鑰屽紓姝ュ畬鎴愮殑鏃跺欓噰鐢ㄥ洖璋冨嚱鏁般傚湪鏌愪釜鐘舵佷笂錛屽鏋滅郴緇熼渶瑕両/O鎿嶄綔錛坮ecv鎴栬卻end錛夛紝鍒欎細璇鋒眰涓涓紓姝 /O錛堟搷浣滅郴緇熸彁渚涚殑寮傛I/O鎴栬呯敱鐢ㄦ埛綰跨▼妯℃嫙鐨勫紓姝/O錛夛紝榪欐椂鍊欑浉搴旂殑HTTP_Context涓嶄細閲嶆柊鍥炲埌鐘舵侀槦鍒楅噷錛岃屽湪I/O瀹屾垚鐨勫洖璋?鍑芥暟閲岄潰鎵嶄細閲嶆柊鏀懼洖鍒扮姸鎬侀槦鍒楋紝寰楀埌閲嶆柊璋冨害鐨勬満浼氥侶TTP_Context寰楀埌閲嶆柊璋冨害鐨勬椂鍊欎細媯鏌/O鐘舵侊紙榪欎釜鍙互閫氳繃涓浜涙爣蹇椾綅鏉ュ畬鎴愶級錛?濡傛灉宸茬粡瀹屾垚錛屽垯澶勭悊鐒跺悗璁劇疆涓嬩竴鐘舵侊紝閲嶆柊璋冨害錛屽惁鍒欏彲浠ラ噸鏂拌姹備竴涓柊鐨処/O璇鋒眰銆侾lug-in涔熷彲浠ヤ嬌鐢ㄧ被浼肩殑鏂規錛屾瘮濡傝涓涓狿lug-in 瑕佽窡澶栭儴鐨勪竴涓湇鍔″櫒閫氫俊錛岃繖鏃跺欏氨鍙互鍦ㄩ氫俊瀹屾垚鐨勬椂鍊欐墠鎶奌TTP_Context閲嶆柊鏀懼洖鍒扮姸鎬侀槦鍒椼傛樉鐒訛紝Plug-in璺烪TTP鐘舵佹槸澶氬澶?鐨勫叧緋伙紝涓涓狿lug-in鍙互鍦ㄨ嫢騫蹭釜鍏沖績鐨勭姸鎬佹敞鍐岃嚜韜紝鍚屾椂榪樺彲浠ヨ緗竴浜泂hort-path鏉ユ彁楂樺鐞嗙殑鏁堢巼銆?/div>

緇撹

鎬葷殑鏉ヨ錛屽紓姝ヨ皟鐢ㄧ殑璁捐鍜屽簲鐢ㄥ綊鏍圭粨搴曞氨鏄澶氫釜涓誨姩瀵硅薄鐨勭鐞嗛棶棰橈細濡備綍鎻愪緵鎵ц鐨勫姩鍔涗互鍙婂浣曚繚璇佹墽琛岀殑欏哄簭閫昏緫銆備富瑕佽冭檻鐨勯棶棰樻槸涓誨姩瀵硅薄鐨勭矑 搴︿互鍙婃墽琛屾柟寮忥紝鍚屾鎴栬呭洖璋冩潵瀹屾垚欏哄簭鐨勮皟搴︼紝鎴栬呬嬌鐢ㄨ繎浼肩殑璋冨害鑰屽姞涓浜涢瞾媯掔殑閿欒澶勭悊鏈哄埗鏉ヤ繚璇佽涔夌殑姝g‘銆傚悗鑰呭彲浠ヨ冭檻鍦ㄤ嬌鐢ㄥ熀浜庝簨浠剁殑 socket鐨勬椂鍊欙紝readable浜嬩歡鐨勯氱煡鍙互鏄啑浣欑殑錛屾垨鑰呰鍙互姣斿疄闄呬腑鍙戠敓鐨剅eadable浜嬩歡鏇村錛岃繖涓椂鍊欎嬌鐢ㄩ潪闃誨鐨剆ocket, 鏈変簺read()錛堟垨鑰卹ecv()錛変細鐩存帴榪斿洖EWOULDBLOCK錛岀郴緇熷彧瑕佽冭檻澶勭悊榪欑鎯呭喌錛堜嬌鐢╪on blocking socket鑰屼笉鏄痓locking socket錛夛紝褰撲緥澶栫殑鎯呭喌涓嶅鐨勬椂鍊欐槸鍙互鎺ュ彈鐨勩傝繖鏃跺欏彲浠ヨ浜嬩歡鐨勬姤鍛婂氨鍙槸榪戜技鐨勩?/div>
from:



chatler 2010-09-06 17:33 鍙戣〃璇勮
]]>涓涓熀浜庡畬鎴愮鍙g殑TCP Server Framework,嫻呮瀽IOCPhttp://www.shnenglu.com/beautykingdom/archive/2010/08/25/124731.htmlchatlerchatlerWed, 25 Aug 2010 12:42:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/08/25/124731.htmlhttp://www.shnenglu.com/beautykingdom/comments/124731.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/08/25/124731.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/124731.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/124731.html濡傛灉浣犱笉鎶曢掞紙POST錛塐verlapped I/O錛岄偅涔圛/O Completion Ports 鍙兘涓轟綘鎻愪緵涓涓猀ueue. 
    CreateIoCompletionPort鐨凬umberOfConcurrentThreads錛?/span>
1.鍙湁褰撶浜屼釜鍙傛暟ExistingCompletionPort涓篘ULL鏃跺畠鎵嶆湁鏁堬紝瀹冩槸涓猰ax threads limits.
2.澶у鏈夎皝鎶婂畠璁劇疆涓鴻秴鍑篶pu涓暟鐨勫鹼紝褰撶劧涓嶅彧鏄痗pu涓暟鐨?鍊嶏紝鑰屾槸涓嬮潰鐨凪AX_THREADS 100鐢氳嚦鏇村ぇ銆?/span>
瀵逛簬榪欎釜鍊肩殑璁懼畾錛宮sdn騫舵病鏈夎闈炲緱璁炬垚cpu涓暟鐨?鍊嶏紝鑰屼笖涔熸病鏈夋妸鍑忓皯綰跨▼涔嬮棿涓婁笅鏂囦氦鎹㈣繖浜涘獎鍝嶆壇鍒拌繖閲屾潵銆侷/O Completion Ports MSDN:"If your transaction required a lengthy computation, a larger concurrency value will allow more threads to run. Each completion packet may take longer to finish, but more completion packets will be processed at the same time. "銆?/span>
    瀵逛簬struct OVERLAPPED錛屾垜浠父浼氬涓嬫墿灞曪紝
typedef struct {
  WSAOVERLAPPED overlapped; //must be first member?   鏄殑錛屽繀欏繪槸絎竴涓傚鏋滀綘涓嶈偗瀹氾紝浣犲彲浠ヨ瘯璇曘?/span>
  SOCKET client_s;
  SOCKADDR_IN client_addr;
  WORD optCode;//1--read,2--send.  鏈変漢甯鎬細瀹氫箟榪欎釜鏁版嵁鎴愬憳錛屼絾涔熸湁浜轟笉鐢紝浜夎鍦╯end/WSASend,姝ゆ椂鐨勫悓姝ュ拰寮傛鏄惁鏈夊繀瑕侊紵 鑷沖皯鎴戜笅闈㈢殑server鏇存湰灝辨病鐢ㄥ畠銆?/span>
  char buf[MAX_BUF_SIZE];
  WSABUF wsaBuf;//inited ?  榪欎釜涓嶈蹇樹簡錛?/span>
  DWORD numberOfBytesTransferred;
  DWORD flags;   

}QSSOverlapped;//for per connection
鎴戜笅闈㈢殑server妗嗘灦鐨勫熀鏈濇兂鏄?
One connection VS one thread in worker thread pool ,worker thread performs completionWorkerRoutine.
A Acceptor thread 涓撻棬鐢ㄦ潵accept socket,鍏寵仈鑷矷OCP,騫禬SARecv:post Recv Completion Packet to IOCP.
鍦╟ompletionWorkerRoutine涓湁浠ヤ笅鐨勮亴璐?
1.handle request,褰撳繖鏃跺鍔燾ompletionWorkerThread鏁伴噺浣嗕笉瓚呰繃maxThreads,post Recv Completion Packet to IOCP.
2.timeout鏃舵鏌ユ槸鍚︾┖闂插拰褰撳墠completionWorkerThread鏁伴噺,褰撶┖闂叉椂淇濇寔鎴栧噺灝戣嚦minThreads鏁伴噺.
3.瀵規墍鏈堿ccepted-socket綆$悊鐢熷懡鍛ㄦ湡,榪欓噷鍒╃敤緋葷粺鐨刱eepalive probes,鑻ユ兂瀹炵幇涓氬姟灞?蹇冭煩鎺㈡祴"鍙渶灝哘SS_SIO_KEEPALIVE_VALS_TIMEOUT 鏀瑰洖緋葷粺榛樿鐨?灝忔椂.
涓嬮潰緇撳悎婧愪唬鐮?嫻呮瀽涓涓婭OCP:
socketserver.h
#ifndef __Q_SOCKET_SERVER__
#define __Q_SOCKET_SERVER__
#include <winsock2.h>
#include <mstcpip.h>
#define QSS_SIO_KEEPALIVE_VALS_TIMEOUT 30*60*1000
#define QSS_SIO_KEEPALIVE_VALS_INTERVAL 5*1000

#define MAX_THREADS 100
#define MAX_THREADS_MIN  10
#define MIN_WORKER_WAIT_TIMEOUT  20*1000
#define MAX_WORKER_WAIT_TIMEOUT  60*MIN_WORKER_WAIT_TIMEOUT

#define MAX_BUF_SIZE 1024

/*褰揂ccepted socket鍜宻ocket鍏抽棴鎴栧彂鐢熷紓甯告椂鍥炶皟CSocketLifecycleCallback*/
typedef void (*CSocketLifecycleCallback)(SOCKET cs,int lifecycle);//lifecycle:0:OnAccepted,-1:OnClose//娉ㄦ剰OnClose姝ゆ椂鐨剆ocket鏈繀鍙敤,鍙兘宸茬粡琚潪姝e父鍏抽棴鎴栧叾浠栧紓甯?

/*鍗忚澶勭悊鍥炶皟*/
typedef int (*InternalProtocolHandler)(LPWSAOVERLAPPED overlapped);//return -1:SOCKET_ERROR

typedef struct Q_SOCKET_SERVER SocketServer;
DWORD initializeSocketServer(SocketServer ** ssp,WORD passive,WORD port,CSocketLifecycleCallback cslifecb,InternalProtocolHandler protoHandler,WORD minThreads,WORD maxThreads,long workerWaitTimeout);
DWORD startSocketServer(SocketServer *ss);
DWORD shutdownSocketServer(SocketServer *ss);

#endif
 qsocketserver.c      綆縐?qss,鐩稿簲鐨凮VERLAPPED綆縐皅ssOl.
#include "socketserver.h"
#include "stdio.h"
typedef struct {  
  WORD passive;//daemon
  WORD port;
  WORD minThreads;
  WORD maxThreads;
  volatile long lifecycleStatus;//0-created,1-starting, 2-running,3-stopping,4-exitKeyPosted,5-stopped 
  long  workerWaitTimeout;//wait timeout  
  CRITICAL_SECTION QSS_LOCK;
  volatile long workerCounter;
  volatile long currentBusyWorkers;
  volatile long CSocketsCounter;//Accepted-socket寮曠敤璁℃暟
  CSocketLifecycleCallback cslifecb;
  InternalProtocolHandler protoHandler;
  WORD wsaVersion;//=MAKEWORD(2,0);
  WSADATA wsData;
  SOCKET server_s;
  SOCKADDR_IN serv_addr;
  HANDLE iocpHandle;
}QSocketServer;

typedef struct {
  WSAOVERLAPPED overlapped;  
  SOCKET client_s;
  SOCKADDR_IN client_addr;
  WORD optCode;
  char buf[MAX_BUF_SIZE];
  WSABUF wsaBuf;
  DWORD numberOfBytesTransferred;
  DWORD flags;
}QSSOverlapped;

DWORD  acceptorRoutine(LPVOID);
DWORD  completionWorkerRoutine(LPVOID);

static void adjustQSSWorkerLimits(QSocketServer *qss){
  /*adjust size and timeout.*/
  /*if(qss->maxThreads <= 0) {
   qss->maxThreads = MAX_THREADS;
        } else if (qss->maxThreads < MAX_THREADS_MIN) {            
         qss->maxThreads = MAX_THREADS_MIN;
        }
        if(qss->minThreads >  qss->maxThreads) {
         qss->minThreads =  qss->maxThreads;
        }
        if(qss->minThreads <= 0) {
            if(1 == qss->maxThreads) {
             qss->minThreads = 1;
            } else {
             qss->minThreads = qss->maxThreads/2;
            }
        }
        
        if(qss->workerWaitTimeout<MIN_WORKER_WAIT_TIMEOUT) 
         qss->workerWaitTimeout=MIN_WORKER_WAIT_TIMEOUT;
        if(qss->workerWaitTimeout>MAX_WORKER_WAIT_TIMEOUT)
         qss->workerWaitTimeout=MAX_WORKER_WAIT_TIMEOUT;        */
}

typedef struct{
 QSocketServer * qss;
 HANDLE th;
}QSSWORKER_PARAM;

static WORD addQSSWorker(QSocketServer *qss,WORD addCounter){
 WORD res=0;
 if(qss->workerCounter<qss->minThreads||(qss->currentBusyWorkers==qss->workerCounter&&qss->workerCounter<qss->maxThreads)){
  DWORD threadId;
  QSSWORKER_PARAM * pParam=NULL;
  int i=0;  
  EnterCriticalSection(&qss->QSS_LOCK);
  if(qss->workerCounter+addCounter<=qss->maxThreads)
   for(;i<addCounter;i++)
   {
    pParam=malloc(sizeof(QSSWORKER_PARAM));
    if(pParam){
     pParam->th=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)completionWorkerRoutine,pParam,CREATE_SUSPENDED,&threadId);
     pParam->qss=qss;
     ResumeThread(pParam->th);
     qss->workerCounter++,res++; 
    }    
   }  
  LeaveCriticalSection(&qss->QSS_LOCK);
 }  
 return res;
}

static void SOlogger(const char * msg,SOCKET s,int clearup){
 perror(msg);
 if(s>0)
 closesocket(s);
 if(clearup)
 WSACleanup();
}

static int _InternalEchoProtocolHandler(LPWSAOVERLAPPED overlapped){
 QSSOverlapped *qssOl=(QSSOverlapped *)overlapped;
 
 printf("numOfT:%d,WSARecvd:%s,\n",qssOl->numberOfBytesTransferred,qssOl->buf);
 //Sleep(500); 
 return send(qssOl->client_s,qssOl->buf,qssOl->numberOfBytesTransferred,0);
}

DWORD initializeSocketServer(SocketServer ** ssp,WORD passive,WORD port,CSocketLifecycleCallback cslifecb,InternalProtocolHandler protoHandler,WORD minThreads,WORD maxThreads,long workerWaitTimeout){
 QSocketServer * qss=malloc(sizeof(QSocketServer));
 qss->passive=passive>0?1:0;
 qss->port=port;
 qss->minThreads=minThreads;
 qss->maxThreads=maxThreads;
 qss->workerWaitTimeout=workerWaitTimeout;
 qss->wsaVersion=MAKEWORD(2,0); 
 qss->lifecycleStatus=0;
 InitializeCriticalSection(&qss->QSS_LOCK);
 qss->workerCounter=0;
 qss->currentBusyWorkers=0;
 qss->CSocketsCounter=0;
 qss->cslifecb=cslifecb,qss->protoHandler=protoHandler;
 if(!qss->protoHandler)
  qss->protoHandler=_InternalEchoProtocolHandler; 
 adjustQSSWorkerLimits(qss);
 *ssp=(SocketServer *)qss;
 return 1;
}

DWORD startSocketServer(SocketServer *ss){ 
 QSocketServer * qss=(QSocketServer *)ss;
 if(qss==NULL||InterlockedCompareExchange(&qss->lifecycleStatus,1,0))
  return 0; 
 qss->serv_addr.sin_family=AF_INET;
 qss->serv_addr.sin_port=htons(qss->port);
 qss->serv_addr.sin_addr.s_addr=INADDR_ANY;//inet_addr("127.0.0.1");
 if(WSAStartup(qss->wsaVersion,&qss->wsData)){  
  /*榪欓噷榪樻湁涓彃鏇插氨鏄繖涓猈SAStartup琚皟鐢ㄧ殑鏃跺?瀹冨眳鐒朵細鍚姩涓鏉¢澶栫殑綰跨▼,褰撶劧紼嶅悗榪欐潯綰跨▼浼氳嚜鍔ㄩ鍑虹殑.涓嶇煡WSAClearup鍙堜細濡備綍?......*/

  SOlogger("WSAStartup failed.\n",0,0);
  return 0;
 }
 qss->server_s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
 if(qss->server_s==INVALID_SOCKET){  
  SOlogger("socket failed.\n",0,1);
  return 0;
 }
 if(bind(qss->server_s,(LPSOCKADDR)&qss->serv_addr,sizeof(SOCKADDR_IN))==SOCKET_ERROR){  
  SOlogger("bind failed.\n",qss->server_s,1);
  return 0;
 }
 if(listen(qss->server_s,SOMAXCONN)==SOCKET_ERROR)/*榪欓噷鏉ヨ皥璋?strong>backlog,寰堝浜轟笉鐭ラ亾璁炬垚浣曞?鎴戣鍒拌繃1,5,50,100鐨?鏈変漢璇磋瀹氱殑瓚婂ぇ瓚婅楄祫婧?鐨勭‘,榪欓噷璁炬垚SOMAXCONN涓嶄唬琛╳indows浼氱湡鐨勪嬌鐢⊿OMAXCONN,鑰屾槸" If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. "錛屽悓鏃跺湪鐜板疄鐜涓紝涓嶅悓鎿嶄綔緋葷粺鏀寔TCP緙撳啿闃熷垪鏈夋墍涓嶅悓錛屾墍浠ヨ繕涓嶅璁╂搷浣滅郴緇熸潵鍐沖畾瀹冪殑鍊箋傚儚Apache榪欑鏈嶅姟鍣細
#ifndef DEFAULT_LISTENBACKLOG
#define DEFAULT_LISTENBACKLOG 511
#endif
*/
    {        
  SOlogger("listen failed.\n",qss->server_s,1);
        return 0;
    }
 qss->iocpHandle=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,/*NumberOfConcurrentThreads-->*/qss->maxThreads);
 //initialize worker for completion routine.
 addQSSWorker(qss,qss->minThreads);  
 qss->lifecycleStatus=2;
 {
  QSSWORKER_PARAM * pParam=malloc(sizeof(QSSWORKER_PARAM));
  pParam->qss=qss;
  pParam->th=NULL;
  if(qss->passive){
   DWORD threadId;
   pParam->th=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)acceptorRoutine,pParam,0,&threadId); 
  }else
   return acceptorRoutine(pParam);
 }
 return 1;
}

DWORD shutdownSocketServer(SocketServer *ss){
 QSocketServer * qss=(QSocketServer *)ss;
 if(qss==NULL||InterlockedCompareExchange(&qss->lifecycleStatus,3,2)!=2)
  return 0; 
 closesocket(qss->server_s/*listen-socket*/);//..other accepted-sockets associated with the listen-socket will not be closed,except WSACleanup is called.. 
 if(qss->CSocketsCounter==0)
  qss->lifecycleStatus=4,PostQueuedCompletionStatus(qss->iocpHandle,0,-1,NULL);
 WSACleanup();  
 return 1;
}

DWORD  acceptorRoutine(LPVOID ss){
 QSSWORKER_PARAM * pParam=(QSSWORKER_PARAM *)ss;
 QSocketServer * qss=pParam->qss;
 HANDLE curThread=pParam->th;
 QSSOverlapped *qssOl=NULL;
 SOCKADDR_IN client_addr;
 int client_addr_leng=sizeof(SOCKADDR_IN);
 SOCKET cs; 
 free(pParam);
 while(1){  
  printf("accept starting.....\n");
  cs/*Accepted-socket*/=accept(qss->server_s,(LPSOCKADDR)&client_addr,&client_addr_leng);
  if(cs==INVALID_SOCKET)
        {
   printf("accept failed:%d\n",GetLastError());   
            break;
        }else{//SO_KEEPALIVE,SIO_KEEPALIVE_VALS 榪欓噷鏄埄鐢ㄧ郴緇熺殑"蹇冭煩鎺㈡祴",keepalive probes.linux:setsockopt,SOL_TCP:TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT
            struct tcp_keepalive alive,aliveOut;
            int so_keepalive_opt=1;
            DWORD outDW;
            if(!setsockopt(cs,SOL_SOCKET,SO_KEEPALIVE,(char *)&so_keepalive_opt,sizeof(so_keepalive_opt))){
               alive.onoff=TRUE;
               alive.keepalivetime=QSS_SIO_KEEPALIVE_VALS_TIMEOUT;
               alive.keepaliveinterval=QSS_SIO_KEEPALIVE_VALS_INTERVAL;
               if(WSAIoctl(cs,SIO_KEEPALIVE_VALS,&alive,sizeof(alive),&aliveOut,sizeof(aliveOut),&outDW,NULL,NULL)==SOCKET_ERROR){
                    printf("WSAIoctl SIO_KEEPALIVE_VALS failed:%d\n",GetLastError());   
                    break;
                }

            }else{
                     printf("setsockopt SO_KEEPALIVE failed:%d\n",GetLastError());   
                     break;
            }  
  }
  
  CreateIoCompletionPort((HANDLE)cs,qss->iocpHandle,cs,0);
  if(qssOl==NULL){
   qssOl=malloc(sizeof(QSSOverlapped));   
  }
  qssOl->client_s=cs;
  qssOl->wsaBuf.len=MAX_BUF_SIZE,qssOl->wsaBuf.buf=qssOl->buf,qssOl->numberOfBytesTransferred=0,qssOl->flags=0;//initialize WSABuf.
  memset(&qssOl->overlapped,0,sizeof(WSAOVERLAPPED));  
  {
   DWORD lastErr=GetLastError();
   int ret=0;
   SetLastError(0);
   ret=WSARecv(cs,&qssOl->wsaBuf,1,&qssOl->numberOfBytesTransferred,&qssOl->flags,&qssOl->overlapped,NULL);
   if(ret==0||(ret==SOCKET_ERROR&&GetLastError()==WSA_IO_PENDING)){
    InterlockedIncrement(&qss->CSocketsCounter);//Accepted-socket璁℃暟閫掑.
    if(qss->cslifecb)
     qss->cslifecb(cs,0);
    qssOl=NULL;
   }    
   
   if(!GetLastError())
    SetLastError(lastErr);
  }
  
  printf("accept flags:%d ,cs:%d.\n",GetLastError(),cs);
 }//end while.

 if(qssOl)
  free(qssOl);
 if(qss)
  shutdownSocketServer((SocketServer *)qss);
 if(curThread)
  CloseHandle(curThread);

 return 1;
}

static int postRecvCompletionPacket(QSSOverlapped * qssOl,int SOErrOccurredCode){ 
 int SOErrOccurred=0; 
 DWORD lastErr=GetLastError();
 SetLastError(0);
 //SOCKET_ERROR:-1,WSA_IO_PENDING:997
 if(WSARecv(qssOl->client_s,&qssOl->wsaBuf,1,&qssOl->numberOfBytesTransferred,&qssOl->flags,&qssOl->overlapped,NULL)==SOCKET_ERROR
  &&GetLastError()!=WSA_IO_PENDING)//this case lastError maybe 64, 10054 
 {
  SOErrOccurred=SOErrOccurredCode;  
 }      
 if(!GetLastError())
  SetLastError(lastErr); 
 if(SOErrOccurred)
  printf("worker[%d] postRecvCompletionPacket SOErrOccurred=%d,preErr:%d,postedErr:%d\n",GetCurrentThreadId(),SOErrOccurred,lastErr,GetLastError());
 return SOErrOccurred;
}

DWORD  completionWorkerRoutine(LPVOID ss){
 QSSWORKER_PARAM * pParam=(QSSWORKER_PARAM *)ss;
 QSocketServer * qss=pParam->qss;
 HANDLE curThread=pParam->th;
 QSSOverlapped * qssOl=NULL;
 DWORD numberOfBytesTransferred=0;
 ULONG_PTR completionKey=0;
 int postRes=0,handleCode=0,exitCode=0,SOErrOccurred=0; 
 free(pParam);
 while(!exitCode){
  SetLastError(0);
  if(GetQueuedCompletionStatus(qss->iocpHandle,&numberOfBytesTransferred,&completionKey,(LPOVERLAPPED *)&qssOl,qss->workerWaitTimeout)){
   if(completionKey==-1&&qss->lifecycleStatus>=4)
   {
    printf("worker[%d] completionKey -1:%d \n",GetCurrentThreadId(),GetLastError());
    if(qss->workerCounter>1)
     PostQueuedCompletionStatus(qss->iocpHandle,0,-1,NULL);
    exitCode=1;
    break;
   }
   if(numberOfBytesTransferred>0){   
    
    InterlockedIncrement(&qss->currentBusyWorkers);
    addQSSWorker(qss,1);
    handleCode=qss->protoHandler((LPWSAOVERLAPPED)qssOl);    
    InterlockedDecrement(&qss->currentBusyWorkers);    
    
    if(handleCode>=0){
     SOErrOccurred=postRecvCompletionPacket(qssOl,1);
    }else
     SOErrOccurred=2;    
   }else{
    printf("worker[%d] numberOfBytesTransferred==0 ***** closesocket servS or cs *****,%d,%d ,ol is:%d\n",GetCurrentThreadId(),GetLastError(),completionKey,qssOl==NULL?0:1);
    SOErrOccurred=3;     
   }  
  }else{ //GetQueuedCompletionStatus rtn FALSE, lastError 64 ,995[timeout worker thread exit.] ,WAIT_TIMEOUT:258        
   if(qssOl){
    SOErrOccurred=postRecvCompletionPacket(qssOl,4);
   }else {    

    printf("worker[%d] GetQueuedCompletionStatus F:%d \n",GetCurrentThreadId(),GetLastError());
    if(GetLastError()!=WAIT_TIMEOUT){
     exitCode=2;     
    }else{//wait timeout     
     if(qss->lifecycleStatus!=4&&qss->currentBusyWorkers==0&&qss->workerCounter>qss->minThreads){
      EnterCriticalSection(&qss->QSS_LOCK);
      if(qss->lifecycleStatus!=4&&qss->currentBusyWorkers==0&&qss->workerCounter>qss->minThreads){
       qss->workerCounter--;//until qss->workerCounter decrease to qss->minThreads
       exitCode=3;      
      }
      LeaveCriticalSection(&qss->QSS_LOCK);
     }
    }    
   }    
  }//end GetQueuedCompletionStatus.

  if(SOErrOccurred){   
   if(qss->cslifecb)
    qss->cslifecb(qssOl->client_s,-1);
   /*if(qssOl)*/{
    closesocket(qssOl->client_s);
    free(qssOl);
   }
   if(InterlockedDecrement(&qss->CSocketsCounter)==0&&qss->lifecycleStatus>=3){    
    //for qss workerSize,PostQueuedCompletionStatus -1
    qss->lifecycleStatus=4,PostQueuedCompletionStatus(qss->iocpHandle,0,-1,NULL);        
    exitCode=4;
   }
  }
  qssOl=NULL,numberOfBytesTransferred=0,completionKey=0,SOErrOccurred=0;//for net while.
 }//end while.

 //last to do 
 if(exitCode!=3){ 
  int clearup=0;
  EnterCriticalSection(&qss->QSS_LOCK);
  if(!--qss->workerCounter&&qss->lifecycleStatus>=4){//clearup QSS
    clearup=1;
  }
  LeaveCriticalSection(&qss->QSS_LOCK);
  if(clearup){
   DeleteCriticalSection(&qss->QSS_LOCK);
   CloseHandle(qss->iocpHandle);
   free(qss); 
  }
 }
 CloseHandle(curThread);
 return 1;
}
------------------------------------------------------------------------------------------------------------------------
    瀵逛簬IOCP鐨凩astError鐨勮鯨鍒拰澶勭悊鏄釜闅劇偣,鎵浠ヨ娉ㄦ剰鎴戠殑completionWorkerRoutine鐨剋hile緇撴瀯,
緇撴瀯濡備笅:
while(!exitCode){
    if(completionKey==-1){...break;}
    if(GetQueuedCompletionStatus){/*鍦ㄨ繖涓猧f浣撲腑鍙浣犳姇閫掔殑OVERLAPPED is not NULL,閭d箞榪欓噷浣犲緱鍒扮殑灝辨槸瀹?/strong>.*/
        if(numberOfBytesTransferred>0){
               /*鍦ㄨ繖閲宧andle request,璁板緱瑕佺戶緇姇閫掍綘鐨凮VERLAPPED鍝? */
        }else{
              /*榪欓噷鍙兘瀹㈡埛绔垨鏈嶅姟绔痗losesocket(the socket),浣嗘槸OVERLAPPED is not NULL,鍙浣犳姇閫掔殑涓嶄負NULL!*/
        }
    }else{/*鍦ㄨ繖閲岀殑if浣撲腑,铏界劧GetQueuedCompletionStatus return FALSE,浣嗘槸涓嶄唬琛∣VERLAPPED涓瀹氫負NULL.鐗瑰埆鏄疧VERLAPPED is not NULL鐨勬儏鍐典笅,涓嶈浠ヤ負LastError鍙戠敓浜?灝變唬琛ㄥ綋鍓嶇殑socket鏃犵敤鎴栧彂鐢熻嚧鍛界殑寮傚父,姣斿鍙戠敓lastError:995榪欑鎯呭喌涓嬫鏃剁殑socket鏈夊彲鑳芥槸涓鍒囨甯哥殑鍙敤鐨?浣犱笉搴旇鍏抽棴瀹?/strong>.*/
        if(OVERLAPPED is not NULL){
             /*榪欑鎯呭喌涓?璇蜂笉綆?7,21緇х畫鎶曢掑惂!鍦ㄦ姇閫掑悗鍐嶆嫻嬮敊璇?/strong>.*/
        }else{ 

        }
    }
  if(socket error occured){

  }
  prepare for next while.

    琛屾枃浠撲績,闅懼厤鏈夐敊璇垨涓嶈凍涔嬪,甯屾湜澶у韙婅穬鎸囨璇勮,璋㈣阿!

    榪欎釜妯″瀷鍦ㄦц兘涓婅繕鏄湁鏀硅繘鐨勭┖闂村摝錛?/strong>


from:

http://www.shnenglu.com/adapterofcoms/archive/2010/06/26/118781.aspx



chatler 2010-08-25 20:42 鍙戣〃璇勮
]]>
IOCPhttp://www.shnenglu.com/beautykingdom/archive/2010/05/05/114496.htmlchatlerchatlerWed, 05 May 2010 07:51:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/05/05/114496.htmlhttp://www.shnenglu.com/beautykingdom/comments/114496.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/05/05/114496.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/114496.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/114496.htmlhttp://msdn.microsoft.com/en-us/library/aa365198%28v=VS.85%29.aspx

鍙﹀錛屼笅闈㈣繖涓鐨勪篃榪樻槸涓嶉敊鐨勩?br>http://www.shnenglu.com/kevinlynx/archive/2008/06/23/54390.html

IOCP 涓庣嚎紼?/a>

author : Kevin Lynx

 

浠涔堟槸瀹屾垚鍖咃紵

瀹屾垚鍖咃紝鍗矷O Completion Packet錛屾槸鎸囧紓姝O鎿嶄綔瀹屾瘯鍚嶰S鎻愪氦緇欏簲鐢ㄥ眰鐨勯氱煡鍖呫侷OCP緇存姢浜嗕竴涓狪O鎿嶄綔緇撴灉闃熷垪錛岄噷闈?br>淇濆瓨鐫鍚勭瀹屾垚鍖呫傚簲鐢ㄥ眰璋冪敤 GQCS(涔熷氨鏄疓etQueueCompletionStatus)鍑芥暟鑾峰彇榪欎簺瀹屾垚鍖呫?

鏈澶у茍鍙戠嚎紼嬫暟

鍦ㄤ竴涓吀鍨嬬殑 IOCP紼嬪簭閲岋紝浼氭湁涓浜涚嚎紼嬭皟鐢℅QCS鍘昏幏鍙朓O鎿嶄綔緇撴灉銆傛渶澶у茍鍙戠嚎紼嬫暟鎸囧畾鍦ㄥ悓涓鏃跺埢澶勭悊瀹屾垚鍖呯殑綰跨▼鏁扮洰銆?br>璇ュ弬鏁板湪璋冪敤 CreateIoCompletionPort鏃剁敱NumberOfConcurrentThreads鎸囧畾銆?

宸ヤ綔鑰呯嚎紼?/strong>

宸ヤ綔鑰呯嚎紼嬩竴鑸寚鐨? 灝辨槸璋冪敤GQCS鍑芥暟鐨勭嚎紼嬨傝娉ㄦ剰鐨勬槸錛屽伐浣滆呯嚎紼嬫暟鍜屾渶澶у茍鍙戠嚎紼嬫暟騫朵笉鏄悓涓鍥炰簨(瑙佷笅鏂?銆傚伐浣滆?br>綰跨▼鐢卞簲鐢ㄥ眰鏄劇ず鍒涘緩 (_beginthreadex 涔嬬被)銆傚伐浣滆呯嚎紼嬮氬父鏄竴涓驚鐜紝浼氫笉鏂湴GQCS鍒板畬鎴愬寘錛岀劧鍚庡鐞嗗畬鎴愬寘銆?

璋冨害榪囩▼

宸ヤ綔鑰呯嚎紼嬩互鏄惁闃誨 鍒嗕負涓ょ鐘舵侊細榪愯鐘舵佸拰絳夊緟鐘舵併傚綋綰跨▼鍋氫竴浜涢樆濉炴搷浣滄椂(綰跨▼鍚屾錛岀敋鑷矴QCS絀虹殑瀹屾垚闃熷垪)錛岀嚎紼?br>澶勪簬絳夊緟鐘舵侊紱鍚﹀垯錛岀嚎紼嬪浜庤繍琛岀姸 鎬併?

鍙︿竴鏂歸潰錛孫S浼氬緇堜繚鎸佹煇涓鏃跺埢澶勪簬榪愯鐘舵佺殑綰跨▼鏁板皬浜庢渶澶у茍鍙戠嚎紼嬫暟銆傛瘡涓涓? 璋冪敤GQCS鍑芥暟鐨勭嚎紼婳S瀹為檯涓婇兘浼氳繘琛岃褰曪紝
褰撳畬鎴愰槦鍒楅噷鏈夊畬鎴愬寘鏃訛紝OS浼氶鍏堟鏌ュ綋鍓嶅浜庤繍琛岀姸鎬佺殑宸ヤ綔綰跨▼鏁版槸鍚﹀皬浜庢渶澶у茍鍙戠嚎紼嬫暟錛? 濡傛灉灝忎簬錛孫S浼氭寜鐓IFO鐨勯『
搴忚鏌愪釜宸ヤ綔鑰呯嚎紼嬩粠GQCS榪斿洖(姝ゅ伐浣滆呯嚎紼嬭漿鎹負榪愯鐘舵?銆傚浣曞喅瀹氳繖涓狶IFO錛熻繖鏄畝鍗曞湴閫氳繃璋冪敤 GQCS鍑芥暟鐨勯『搴忓喅瀹氱殑銆?

浠庤繖閲屽彲浠ョ湅鍑猴紝榪欓噷娑夊強鍒扮嚎紼嬪敜閱掑拰鐫$湢鐨勬搷浣溿傚鏋滀袱涓? 綰跨▼琚斁緗簬鍚屼竴涓狢PU涓婏紝灝變細鏈夌嚎紼嬪垏鎹㈢殑寮閿銆傚洜姝わ紝涓轟簡娑?br>闄よ繖涓紑閿錛屾渶澶у茍鍙戠嚎紼嬫暟琚緩璁負璁劇疆鎴怌PU鏁伴噺銆?

浠庝互涓婅皟搴﹁繃紼嬭繕鍙互鐪嬪嚭錛屽鏋滄煇涓浜庤繍琛岀姸鎬佺殑宸ヤ綔鑰呯嚎紼嬪湪澶勭悊瀹屾垚鍖呮椂闃誨浜?渚嬪綰跨▼鍚屾銆佸叾浠朓O鎿嶄綔)錛岄偅涔堝氨鏈?br>CPU 璧勬簮澶勪簬絀洪棽鐘舵併傚洜姝わ紝鎴戜滑涔熺湅鍒板緢澶氭枃妗i噷寤鴻錛屽伐浣滆呯嚎紼嬫暟涓?CPU鏁?2+2)銆?

鍦ㄤ竴涓瓑寰呯嚎紼嬭漿鎹㈠埌榪愯鐘舵佹椂錛屾湁鍙兘浼氬嚭鐜扮煭鏆傜殑鏃墮棿榪愯綰跨▼鏁拌秴榪囨渶澶у茍鍙戠嚎紼嬫暟錛岃繖涓椂鍊橭S浼氳繀閫熷湴璁╄繖涓柊杞崲
鐨? 綰跨▼闃誨錛屼粠鑰屽噺灝戣繖涓暟閲忋?鍏充簬榪欎釜瑙傜偣錛孧SDN涓婂彧璇達細by not allowing any new active threads錛屽嵈娌¤鏄巒ot allowing
what)

璋? 搴﹀師鐞?/strong>

榪欎釜鐭ラ亾浜嗗叾瀹炴病浠涔堟剰涔夛紝閮芥槸鍐呮牳鍋氱殑浜嬶紝澶ц嚧涓婇兘鏄搷浣滅嚎 紼媍ontrol block錛岀洿鎺ユ憳褰?lt;Inside IO Completion Ports>:

The list of threads hangs off the queue object. A thread's control block data structure has a pointer in it that
references the queue object of a queue that it is associated with; if the pointer is NULL then the thread is not
associated with a queue.

So how does NT keep track of threads that become inactive because they block on something other than the completion
port" The answer lies in the queue pointer in a thread's control block. The scheduler routines that are executed
in response to a thread blocking (KeWaitForSingleObject, KeDelayExecutionThread, etc.) check the thread's queue
pointer and if its not NULL they will call KiActivateWaiterQueue, a queue-related function. KiActivateWaiterQueue
decrements the count of active threads associated with the queue, and if the result is less than the maximum and
there is at least one completion packet in the queue then the thread at the front of the queue's thread list is
woken and given the oldest packet. Conversely, whenever a thread that is associated with a queue wakes up after
blocking the scheduler executes the function KiUnwaitThread, which increments the queue's active count.

鍙? 鑰冭祫鏂?/strong>

<Inside I/O Completion Ports>:
http://technet.microsoft.com/en-us/sysinternals/bb963891.aspx
<I/O Completion Ports>:
http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
<INFO: Design Issues When Using IOCP in a Winsock Server>:
http://support.microsoft.com/kb/192800/en-us/





chatler 2010-05-05 15:51 鍙戣〃璇勮
]]>
CALLBACK, WINAPI, AFXAPI鍜屽嚱鏁拌皟鐢ㄦ柟寮?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/04/28/113791.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Tue, 27 Apr 2010 16:10:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/04/28/113791.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/113791.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/04/28/113791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/113791.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/113791.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt;">(VC緙栬瘧鍣ㄤ笅)</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;"><strong>1. CALLBACK</strong><strong>錛?/strong><strong>WINAPI</strong><strong>鍜?/strong><strong>AFXAPI</strong><strong>鍒板簳鏄粈涔堬紵瀹冧滑鍒嗗埆鍦ㄤ粈涔堝湴鏂? 琚畾涔夌殑錛?/strong><strong></strong></p> <p style="margin: 0cm 0cm 0pt;">鍦ㄥご鏂囦歡windef.h涓紝CALLBACK, WINAPI, APIENTRY</p> <p style="margin: 0cm 0cm 0pt;">……</p> <p style="margin: 0cm 0cm 0pt;"><strong>#define CALLBACK  __stdcall</strong></p> <p style="margin: 0cm 0cm 0pt;"><strong>#define WINAPI         __stdcall</strong></p> <p style="margin: 0cm 0cm 0pt;">#define WINAPIV       __cdecl</p> <p style="margin: 0cm 0cm 0pt;"><strong>#define APIENTRY    WINAPI</strong></p> <p style="margin: 0cm 0cm 0pt;">……</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">鍦ㄥご鏂囦歡AFXVER_.H涓紝AFXAPI鐨勫畾涔夊涓嬶細</p> <p style="margin: 0cm 0cm 0pt;">    ……</p> <p style="margin: 0cm 0cm 0pt;">   // AFXAPI is used on global public functions</p> <p style="margin: 0cm 0cm 0pt;">#ifndef AFXAPI</p> <p style="margin: 0cm 0cm 0pt;"><strong>        #define AFXAPI __stdcall</strong></p> <p style="margin: 0cm 0cm 0pt;">#endif</p> <p style="margin: 0cm 0cm 0pt;">    ……</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;"><strong>2. __stdcall</strong><strong>鍜?/strong><strong>__cdecl</strong><strong>鏈変粈涔堜綔鐢紵浠栦滑鐨勫尯鍒槸浠涔堬紵</strong><strong></strong></p> <p style="margin: 0cm 0cm 0pt;">a. __stdcall鏄柊鏍囧噯C/C++鍑芥暟鐨勮皟鐢ㄦ柟娉曘備粠搴曞眰涓婅錛屼嬌鐢ㄨ繖縐嶈皟鐢ㄦ柟娉曞弬鏁扮殑榪涙爤欏哄簭鍜? 鏍囧噯C璋冪敤(__cdecl鏂規硶)鏄竴鏍風殑,閮?/p> <p style="margin: 0cm 0cm 0pt;">  鏄粠鍙沖埌宸?浣嗘槸__stdcall閲囩敤鑷姩娓呮爤鐨勬柟寮忥紝鑰宊_cdecl鏄墜宸ユ竻鏍堛?/p> <p style="margin: 0cm 0cm 0pt;"></p> <p style="margin: 0cm 0cm 0pt;">b. windows瑙勫畾,鍑′簨鐢卞畠鏉ヨ礋璐h皟鐢ㄧ殑鍑芥暟蹇呴』瀹氫箟涓篲stdcall綾誨瀷錛屾瘮濡傚洖璋冨嚱鏁般乄inMain鍑芥暟絳夈?/p> <p style="margin: 0cm 0cm 0pt;"></p> <p style="margin: 0cm 0cm 0pt;">c. 濡傛灉娌℃湁鏄捐瘯澹版槑鐨勮瘽錛屽嚱鏁扮殑璋冪敤鏂規硶榛樿鏄痏_cdecl銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;"><strong>3. </strong><strong>璋冪敤綰﹀畾縐嶇被</strong><strong></strong></p> <p style="margin: 0cm 0cm 0pt;">   涓鍏辨湁5涓嚱鏁拌皟鐢ㄧ害瀹?calling convention)錛屽畠鍐沖畾涓涓嬪唴 瀹癸細</p> <p style="margin: 0cm 0cm 0pt;">   1) 鍑芥暟鍙傛暟鐨勫帇鏍堥『搴?/p> <p style="margin: 0cm 0cm 0pt;">   2) 鐢辮皟鐢ㄨ呰繕鏄璋冪敤鑰呮妸鍙傛暟寮瑰嚭鏍?/p> <p style="margin: 0cm 0cm 0pt;">   3) 浜х敓鍑芥暟淇グ鍚嶇殑鏂規硶</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__stdcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">鍑芥暟鐨勫弬鏁拌嚜鍙沖悜宸﹂氳繃鏍堜紶閫掞紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬紝</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__cdecl璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">鏄疌鍜孋++紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忋傛瘡涓涓皟鐢ㄥ畠鐨勫嚱鏁伴兘鍖呭惈娓呯┖鍫嗘爤鐨勪唬鐮侊紝 鎵浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇皟鐢╛_stdcall鍑芥暟鐨勫ぇ銆傚嚱鏁伴噰鐢ㄤ粠鍙沖埌宸︾殑鍘嬫爤鏂瑰紡銆傛敞鎰忥細瀵逛簬鍙彉鍙傛暟鐨勬垚鍛樺嚱鏁幫紝濮嬬粓浣跨敤__cdecl鐨勮漿鎹㈡柟寮忋?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__fastcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">瀹冩槸閫氳繃瀵勫瓨鍣ㄦ潵浼犻佸弬鏁扮殑(瀹為檯涓婏紝瀹冪敤ECX鍜孍DX浼犻佸墠涓や釜鍙屽瓧(DWORD)鎴栨洿灝忕殑鍙傛暟錛屽墿涓嬬殑鍙傛暟浠嶆棫鑷彸鍚戝乏鍘嬫爤浼犻侊紝琚皟鐢ㄧ殑鍑芥暟鍦? 榪斿洖鍓嶆竻鐞嗕紶閫佸弬鏁扮殑鍐呭瓨鏍?銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">thiscall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">浠呬粎搴旂敤浜?C++"鎴? 鍛樺嚱鏁般倀his鎸? 閽堝瓨鏀句簬CX瀵勫瓨 鍣紝鍙傛暟浠庡彸鍒板乏鍘嬨倀hiscall涓嶆槸鍏抽敭璇嶏紝鍥犳涓嶈兘琚▼搴忓憳鎸囧畾銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">naked call璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">閲囩敤涓婅堪4縐嶈皟鐢ㄧ害 瀹氭椂錛屽鏋滃繀瑕佺殑璇濓紝榪涘叆鍑芥暟鏃剁紪璇戝櫒浼氫駭鐢熶唬鐮佹潵淇濆瓨ESI錛孍DI錛孍BX錛孍BP瀵勫瓨鍣紝閫鍑哄嚱鏁版椂鍒欎駭鐢熶唬鐮佹仮澶嶈繖浜涘瘎瀛樺櫒鐨勫唴瀹廣俷aked call涓嶄駭鐢熻繖鏍風殑浠g爜銆俷aked call涓嶆槸綾誨瀷淇グ絎︼紝鏁呭繀欏誨拰_declspec鍏卞悓浣跨敤銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">鍏抽敭瀛?__stdcall銆乢_cdecl 鍜?__fastcall 鍙互鐩存帴鍔犲湪瑕佽緭鍑虹殑鍑芥暟鍓嶏紝涔熷彲浠ュ湪緙栬瘧鐜鐨?Setting...\C/C++ \Co<wbr>de Generation 欏歸夋嫨銆傚綋鍔犲湪 杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛椾笌緙栬瘧鐜涓殑閫夋嫨涓嶅悓鏃訛紝鐩存帴鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛楁湁鏁堛傚畠浠搴旂殑鍛戒護琛屽弬鏁板垎鍒負/Gz銆?Gd 鍜?/Gr銆傜己鐪佺姸鎬佷負/Gd錛屽嵆__cdecl銆傜己鐪佺姸鎬佷負__cdecl銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;"><strong>4. </strong><strong>鍚? 瀛椾慨楗扮害瀹?/strong><strong></strong></p> <p style="margin: 0cm 0cm 0pt;">"C" 鎴栬?"C++" 鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇? 鍑芥暟瀹氫箟鎴栬呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?C++"閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤"C""鎴?C++"鍑芥暟絳夈備慨楗板悕鐢卞嚱鏁板悕銆佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓 鍐沖畾銆傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾?C鎴朇++)鍜岃皟鐢ㄧ害瀹氱殑涓嶅悓鑰屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">C緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?/p> <p style="margin: 0cm 0cm 0pt;">__stdcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">    鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴 涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?@"絎﹀彿 鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負 _functionname@number銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__cdecl璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">    浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負 _functionname銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__fastcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">    鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?@"絎﹀彿錛屽悗闈篃鏄竴涓?@"絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負@functionname@number銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">C++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?/p> <p style="margin: 0cm 0cm 0pt;">__stdcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">浠??"鏍囪瘑 鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱鍑芥暟鍚嶅悗闈互"@@YG"鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱</p> <p style="margin: 0cm 0cm 0pt;">鍙傛暟琛ㄤ互浠e彿琛ㄧず錛?/p> <p style="margin: 0cm 0cm 0pt;">    X鈥斺攙oid錛?/p> <p style="margin: 0cm 0cm 0pt;">    D鈥斺攃har錛?/p> <p style="margin: 0cm 0cm 0pt;">    E鈥斺攗nsigned char錛?/p> <p style="margin: 0cm 0cm 0pt;">    F鈥斺攕hort錛?/p> <p style="margin: 0cm 0cm 0pt;">    H鈥斺攊nt錛?/p> <p style="margin: 0cm 0cm 0pt;">    I鈥斺攗nsigned int錛?/p> <p style="margin: 0cm 0cm 0pt;">    J鈥斺攍ong錛?/p> <p style="margin: 0cm 0cm 0pt;">    K鈥斺攗nsigned long錛?/p> <p style="margin: 0cm 0cm 0pt;">    M鈥斺攆loat錛?/p> <p style="margin: 0cm 0cm 0pt;">    N鈥斺攄ouble錛?/p> <p style="margin: 0cm 0cm 0pt;">    _N鈥斺攂ool錛?/p> <p style="margin: 0cm 0cm 0pt;">    ....</p> <p style="margin: 0cm 0cm 0pt;">    PA鈥斺旇〃紺烘寚閽堬紝鍚庨潰鐨勪唬鍙瘋〃鏄庢寚閽堢被鍨嬶紝濡傛灉鐩稿悓綾誨瀷鐨勬寚閽堣繛緇嚭鐜幫紝 浠?0"浠f浛錛屼竴涓?0"浠h〃涓嬈¢噸澶嶏紱</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">鍙傛暟琛ㄧ殑絎竴欏逛負璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠銆?/p> <p style="margin: 0cm 0cm 0pt;">鍙傛暟琛ㄥ悗浠?@Z"鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?Z"鏍囪瘑緇撴潫銆傚叾鏍煎紡涓?/p> <p style="margin: 0cm 0cm 0pt;">    "?functionname@@YG*****@Z" 鎴? "?functionname@@YG*XZ"錛?/p> <p style="margin: 0cm 0cm 0pt;">    渚嬪</p> <p style="margin: 0cm 0cm 0pt;">    int Test1(char *var1,unsigned long)    -----“?Test1@@YGHPADK@Z”</p> <p style="margin: 0cm 0cm 0pt;">    void Test2()銆銆銆銆銆銆銆銆銆銆銆   -----“?Test2@@YGXXZ”(絎竴涓猉琛ㄧず榪斿洖綾誨瀷錛岀浜屼釜X琛ㄧず鍙傛暟 綾誨瀷)</p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__cdecl璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">    瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?@@YG"鍙樹負"@@YA"銆俈C++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?__cedcl"錛屽皢鍙兘琚獵/C++璋冪敤銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">__fastcall璋冪敤綰﹀畾錛?/p> <p style="margin: 0cm 0cm 0pt;">    瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?@@YG"鍙樹負"@@YI"銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">瀵逛簬C++鐨勭被鎴愬憳鍑芥暟錛堝叾璋冪敤鏂瑰紡鏄痶hiscall錛夛紝鍑芥暟鐨勫悕瀛椾慨楗頒笌闈炴垚鍛樼殑C++鍑芥暟紼嶆湁涓嶅悓錛岄鍏堝氨鏄湪鍑芥暟鍚嶅瓧鍜屽弬鏁拌〃涔嬮棿鎻掑叆浠?#8220;@”瀛楃寮曞鐨勭被鍚嶏紱鍏舵鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗕笉鍚岋紝鍏湁錛坧ublic錛夋垚鍛樺嚱鏁扮殑鏍囪瘑鏄?#8220;@@QAE”,淇濇姢錛坧rotected錛夋垚鍛樺嚱鏁扮殑鏍囪瘑鏄?#8220;@@IAE”,縐佹湁錛坧rivate錛夋垚鍛樺嚱鏁扮殑鏍囪瘑鏄?#8220;@@AAE”錛屽鏋滃嚱鏁板0鏄庝嬌鐢ㄤ簡const鍏抽敭瀛楋紝鍒欑浉搴旂殑鏍囪瘑搴斿垎鍒負“@@QBE”錛?#8220;@@IBE”鍜?#8220;@@ABE”銆傚鏋滃弬鏁扮被鍨嬫槸綾誨疄渚嬬殑寮曠敤錛屽垯浣跨敤“AAV1”錛屽浜巆onst綾誨瀷鐨勫紩鐢紝鍒欎嬌鐢?#8220;ABV1”銆備笅闈㈠氨浠ョ被CTest涓轟緥璇存槑C++鎴愬憳鍑芥暟鐨勫悕瀛椾慨楗拌鍒欙細</p> <p style="margin: 0cm 0cm 0pt;">class CTest</p> <p style="margin: 0cm 0cm 0pt;">{</p> <p style="margin: 0cm 0cm 0pt;">......</p> <p style="margin: 0cm 0cm 0pt;">private:</p> <p style="margin: 0cm 0cm 0pt;">    void Function(int);</p> <p style="margin: 0cm 0cm 0pt;">protected:</p> <p style="margin: 0cm 0cm 0pt;">    void CopyInfo(const CTest &src);</p> <p style="margin: 0cm 0cm 0pt;">public:</p> <p style="margin: 0cm 0cm 0pt;">    long DrawText(HDC hdc, long pos, const TCHAR* text, RGBQUAD color, BYTE bUnder, bool bSet);</p> <p style="margin: 0cm 0cm 0pt;">    long InsightClass(DWORD dwClass) const;</p> <p style="margin: 0cm 0cm 0pt;">......</p> <p style="margin: 0cm 0cm 0pt;">};</p> <p style="margin: 0cm 0cm 0pt;">瀵逛簬鎴愬憳鍑芥暟Function錛屽叾鍑芥暟淇グ鍚嶄負“?Function@CTest@@AAEXH@Z”錛屽瓧絎︿覆“@@AAE”琛ㄧず榪欐槸涓涓鏈夊嚱鏁般?#8220;X”琛ㄧず榪斿洖綾誨瀷涓簐oid錛?#8220;H”琛ㄧず鍙傛暟綾誨瀷涓篿nt綾誨瀷銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">鎴愬憳鍑芥暟CopyInfo鍙湁涓涓弬鏁幫紝鏄綾籆Test鐨刢onst寮曠敤鍙傛暟錛屽叾鍑芥暟淇グ鍚嶄負“?CopyInfo@CTest@@IAEXABV1@@Z”銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">DrawText鏄竴涓瘮杈冨鏉傜殑鍑芥暟澹版槑錛屼笉浠呮湁瀛楃涓插弬鏁幫紝榪樻湁緇撴瀯浣撳弬鏁板拰HDC鍙ユ焺鍙傛暟錛岄渶瑕佹寚鍑虹殑鏄疕DC瀹為檯涓婃槸涓涓狧DC__緇撴瀯綾誨瀷鐨勬寚閽堬紝榪欎釜鍙傛暟鐨勮〃紺哄氨鏄?#8220;PAUHDC__@@”錛屽叾瀹屾暣鐨勫嚱鏁頒慨楗板悕涓?#8220;?DrawText@CTest@@QAEJPAUHDC__@@JPBDUtagRGBQUAD@@E_N@Z”銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">InsightClass鏄竴涓叡鏈夌殑const鍑芥暟錛屽畠鐨勬垚鍛樺嚱鏁版爣璇嗘槸“@@QBE”錛屽畬鏁寸殑淇グ鍚嶅氨鏄?#8220;?InsightClass@CTest@@QBEJK@Z”銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">涓句緥錛?/p> <p style="margin: 0cm 0cm 0pt;">姣斿鍔ㄦ侀摼鎺ュ簱a鏈変互涓嬪鍑哄嚱鏁幫細</p> <p style="margin: 0cm 0cm 0pt;">long MakeFun(long lFun);</p> <p style="margin: 0cm 0cm 0pt;">鍔ㄦ佸簱鐢熸垚鐨勬椂鍊欓噰鐢ㄧ殑鍑芥暟璋冪敤綰﹀畾鏄痏_stdcall錛屾墍浠ョ紪璇戠敓鎴愮殑a.dll涓嚱鏁癕akeFun鐨勮皟鐢ㄧ害瀹氭槸_stdcall錛屼篃灝辨槸鍑芥暟璋冪敤鏃跺弬鏁頒粠鍙沖悜宸﹀叆鏍堬紝鍑芥暟榪斿洖鏃惰嚜宸辮繕鍘熷爢鏍堛傜幇鍦ㄦ煇涓▼搴忔ā鍧梑瑕佸紩鐢╝涓殑MakeFun錛宐鍜宎涓鏍蜂嬌鐢–++鏂瑰紡緙栬瘧錛屽彧鏄痓妯″潡鐨勫嚱鏁拌皟鐢ㄦ柟寮忔槸__cdecl錛岀敱浜巄鍖呭惈浜哸鎻愪緵鐨勫ご鏂囦歡涓璏akeFun鍑芥暟澹版槑錛屾墍浠akeFun鍦╞妯″潡涓 鍏跺畠璋冪敤MakeFun鐨勫嚱鏁拌涓烘槸__cdecl璋冪敤鏂瑰紡錛宐妯″潡涓殑 榪欎簺鍑芥暟鍦ㄨ皟鐢ㄥ畬MakeFun褰撶劧瑕佸府鐫鎭㈠鍫嗘爤鍟︼紝鍙槸MakeFun宸茬粡鍦ㄧ粨鏉熸椂鑷繁鎭㈠浜嗗爢鏍堬紝b妯″潡涓殑鍑芥暟榪欐牱澶氭涓涓懼氨寮曡搗浜嗘爤鎸囬拡閿欒錛屼粠鑰屽紩鍙戝爢鏍堝紓甯搞傚畯瑙備笂鐨勭幇璞″氨鏄嚱鏁拌皟鐢ㄦ病鏈夐棶棰橈紙鍥犱負鍙傛暟浼犻? 欏哄簭鏄竴鏍風殑錛夛紝MakeFun涔熷畬鎴愪簡鑷繁鐨勫姛鑳斤紝鍙槸鍑芥暟榪斿洖鍚庡紩鍙戦敊璇傝В鍐崇殑鏂規硶涔熷緢綆鍗曪紝鍙淇濊瘉涓や釜妯″潡鐨勫湪緙栬瘧鏃惰緗浉鍚岀殑鍑芥暟璋冪敤綰﹀畾灝辮浜嗐?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">鐜板湪鍐嶅亣瀹氫袱涓ā鍧楀湪緙栬瘧鐨勬椂鍊欓兘閲囩敤__stdcall璋冪敤綰﹀畾錛屼絾鏄痑.dll浣跨敤C璇█鐨勮娉曠紪璇戠殑(C璇█鏂瑰紡)錛屾墍浠.dll鐨? 杞藉叆搴揳.lib涓璏akeFun鍑芥暟鐨勫悕瀛椾慨楗板氨鏄?#8220;_MakeFun@4”銆俠鍖呭惈浜哸鎻愪緵鐨勫ご鏂囦歡涓璏akeFun鍑芥暟澹版槑錛屼絾鏄敱浜巄閲囩敤鐨勬槸C++璇█緙栬瘧錛屾墍浠akeFun鍦╞妯″潡涓鎸夌収C++鐨勫悕瀛椾慨楗拌鍒欏懡鍚嶄負“?MakeFun@@YGJJ@Z”錛岀紪璇戣繃紼嬬浉瀹夋棤浜嬶紝閾炬帴紼嬪簭鏃禼++鐨勯摼鎺ュ櫒灝卞埌a.lib涓幓鎵?#8220;?MakeFun@@YGJJ@Z”錛屼絾鏄痑.lib涓彧鏈?#8220;_MakeFun@4”錛屾病鏈?#8220;?MakeFun@@YGJJ@Z”錛屼簬鏄摼鎺ュ櫒灝辨姤鍛婏細</p> <p style="margin: 0cm 0cm 0pt;">error LNK2001: unresolved external symbol ?MakeFun@@YGJJ@Z</p> <p style="margin: 0cm 0cm 0pt;">瑙e喅鐨勬柟娉曞拰綆鍗曪紝灝辨槸瑕佽b妯″潡鐭ラ亾榪欎釜鍑芥暟鏄疌璇█緙栬瘧鐨勶紝extern "C"鍙互鍋氬埌榪欎竴鐐廣備竴涓噰鐢–璇█緙栬瘧鐨勫簱搴旇鑰冭檻鍒頒嬌鐢ㄨ繖涓簱鐨勭▼搴忓彲鑳芥槸C++紼嬪簭錛堜嬌鐢–++緙栬瘧鍣級錛屾墍浠ュ湪璁捐澶存枃浠舵椂搴旇娉ㄦ剰榪欎竴鐐廣傞氬父搴旇榪欐牱澹版槑 澶存枃浠訛細</p> <p style="margin: 0cm 0cm 0pt;">#ifdef _cplusplus</p> <p style="margin: 0cm 0cm 0pt;">extern "C" {</p> <p style="margin: 0cm 0cm 0pt;">#endif</p> <p style="margin: 0cm 0cm 0pt;">long MakeFun(long lFun);</p> <p style="margin: 0cm 0cm 0pt;">#ifdef _cplusplus</p> <p style="margin: 0cm 0cm 0pt;">}</p> <p style="margin: 0cm 0cm 0pt;">#endif</p> <p style="margin: 0cm 0cm 0pt;">榪欐牱C++鐨勭紪璇戝櫒灝辯煡閬揗akeFun鐨勪慨楗板悕鏄?#8220;_MakeFun@4”錛屽氨涓嶄細鏈夐摼鎺ラ敊璇簡銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;">璁稿浜轟笉鏄庣櫧錛屼負浠涔堟垜浣跨敤鐨勭紪璇戝櫒閮芥槸VC鐨勭紪璇戝櫒榪樹細浜х敓“error LNK2001”閿欒錛熷叾瀹烇紝VC鐨勭紪璇戝櫒浼氭牴鎹簮鏂囦歡鐨勬墿灞曞悕閫夋嫨緙栬瘧鏂瑰紡錛屽鏋滄枃浠剁殑鎵╁睍鍚嶆槸“.C”錛岀紪璇戝櫒浼氶噰鐢–鐨勮娉曠紪璇戯紝濡傛灉鎵╁睍鍚嶆槸“.cpp”錛岀紪璇戝櫒浼氫嬌鐢–++鐨勮娉曠紪璇戠▼搴忥紝鎵浠ワ紝鏈濂界殑鏂規硶灝辨槸浣跨敤extern "C"銆?/p> <p style="margin: 0cm 0cm 0pt;"> </p> <p style="margin: 0cm 0cm 0pt;"><strong>5. </strong><strong>鍗曠湅鍑芥暟鐨勫悕瀛椾慨楗?/strong><strong></strong></p> 鏈変袱縐嶆柟寮忓彲浠ユ鏌ヤ綘鐨勭▼搴忎腑鐨勫嚱鏁扮殑鍚嶅瓧淇グ錛氫嬌鐢ㄧ紪璇戣緭鍑哄垪琛ㄦ垨浣跨敤Dumpbin宸ュ叿銆備嬌鐢?FAc錛?FAs鎴?FAcs鍛戒護琛屽弬鏁板彲浠ヨ緙栬瘧鍣ㄨ緭鍑哄嚱鏁版垨鍙橀噺鍚嶅瓧鍒楄〃銆備嬌鐢╠umpbin.exe /SYMBOLS鍛戒護涔熷彲浠ヨ幏寰梠bj鏂囦歡鎴杔ib鏂囦歡涓殑鍑芥暟鎴栧彉閲忓悕瀛楀垪琛ㄣ傛澶栵紝榪樺彲浠ヤ嬌鐢?undname.exe 灝嗕慨楗板悕杞崲涓烘湭淇グ褰㈠紡銆? <br><br>from:<br><a >http://patmusing.blog.163.com/blog/static/13583496020103233446784/ </a><br><br><img src ="http://www.shnenglu.com/beautykingdom/aggbug/113791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-04-28 00:10 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/04/28/113791.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>An In-Depth Look into the Win32 Portable Executable File Formathttp://www.shnenglu.com/beautykingdom/archive/2010/03/25/110504.htmlchatlerchatlerThu, 25 Mar 2010 07:17:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/03/25/110504.htmlhttp://www.shnenglu.com/beautykingdom/comments/110504.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/03/25/110504.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/110504.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/110504.html闃呰鍏ㄦ枃

chatler 2010-03-25 15:17 鍙戣〃璇勮
]]>
寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/01/04/104762.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Mon, 04 Jan 2010 07:21:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/01/04/104762.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/104762.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/01/04/104762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/104762.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/104762.html</trackback:ping><description><![CDATA[ <span style="border-collapse: collapse; color: rgb(2, 54, 141); font-family: song, Verdana; font-size: 19px; font-weight: bold; ">寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣?/span> <div><font color="#02368D" face="song, Verdana" size="6"><span style="border-collapse: collapse; font-size: 19px;"><strong><div>寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣ㄤ箣涓 寮傛IO</div><div><br></div><div>鑳屾櫙錛氳疆璇?PIO DMA 涓柇</div><div><br></div><div>    鏃╂湡IO璁懼鐨勯熷害涓嶤PU鐩告瘮錛岃繕涓嶆槸澶偓孌娿侰PU瀹氭椂杞涓閬岻O璁懼錛岀湅鐪嬫湁鏃犲鐞嗚姹傦紝鏈夊垯鍔犱互澶勭悊錛屽畬鎴愬悗榪斿洖緇х畫宸ヤ綔銆傝嚦浠婏紝杞洏椹卞姩鍣ㄨ繕淇濈暀鐫榪欑杞宸ヤ綔鏂瑰紡銆?/div><div>    闅?鐫CPU鎬ц兘鐨勮繀閫熸彁楂橈紝榪欑鏁堢巼浣庝笅鐨勫伐浣滄柟寮忔氮璐逛簡澶ч噺鐨凜PU鏃墮棿銆傚洜姝わ紝涓柇宸ヤ綔鏂瑰紡寮濮嬫垚涓烘櫘閬嶉噰鐢ㄧ殑鎶鏈傝繖縐嶆妧鏈嬌寰桰O璁懼鍦ㄩ渶瑕佸緱鍒版湇 鍔℃椂錛岃兘澶熶駭鐢熶竴涓‖浠朵腑鏂紝榪嬌CPU鏀懼純鐩墠鐨勫鐞嗕換鍔★紝榪涘叆鐗瑰畾鐨勪腑鏂湇鍔¤繃紼嬶紝涓柇鏈嶅姟瀹屾垚鍚庯紝鍐嶇戶緇師鍏堢殑澶勭悊銆傝繖鏍蜂竴鏉ワ紝IO璁懼鍜孋PU鍙?浠ュ悓鏃惰繘琛屽鐞嗭紝浠庤岄伩鍏嶄簡CPU絳夊緟IO瀹屾垚銆?/div><div>    鏃╂湡鏁版嵁鐨勪紶杈撴柟寮忎富瑕佹槸PIO錛堢▼鎺O錛夋柟寮忋傞氳繃瀵笽O鍦板潃緙栫▼鏂瑰紡鐨勬柟寮忔潵浼犺緭 鏁版嵁銆傛瘮濡備覆琛屽彛錛岃蔣浠舵瘡嬈″線涓茶鍙d笂鍐欎竴涓瓧鑺傛暟鎹紝涓插彛璁懼瀹屾垚浼犺緭浠誨姟鍚庯紝灝嗕細浜х敓涓涓腑鏂紝鐒跺悗杞歡鍐嶆閲嶅鐩村埌鍏ㄩ儴鏁版嵁鍙戦佸畬鎴愩傛ц兘鏇村ソ鐨勭‖ 浠惰澶囨彁渚涗竴涓狥IFO錛堝厛榪涘厛鍑虹紦鍐查儴浠訛級錛屽彲浠ヨ杞歡涓嬈′紶杈撴洿澶氱殑瀛楄妭銆?/div><div>    鏄劇劧錛屼嬌鐢≒IO鏂瑰紡瀵逛簬楂橀烮O璁懼鏉ヨ錛岃繕鏄崰鐢ㄤ簡澶?澶氱殑CPU鏃墮棿錛堝洜涓洪渶瑕侀氳繃CPU緙栫▼鎺у埗浼犺緭錛夈傝孌MA錛堢洿鎺ュ唴瀛樿闂級鏂瑰紡鑳藉鏋佸ぇ鍦板噺灝慍PU澶勭悊鏃墮棿銆侰PU浠呴渶鍛婅瘔DMA鎺у埗鍣ㄦ暟鎹潡鐨勮搗 濮嬪湴鍧鍜屽ぇ灝忥紝浠ュ悗DMA鎺у埗鍣ㄥ氨鍙互鑷鍦ㄥ唴瀛樺拰璁懼涔嬮棿浼犺緭鏁版嵁錛屽叾闂碈PU鍙互澶勭悊鍏朵粬浠誨姟銆傛暟鎹紶杈撳畬姣曞悗灝嗕細浜х敓涓涓腑鏂?/div><div><br></div><div>鍚屾鏂囦歡IO鍜屽紓姝ユ枃浠禝O</div><div><br></div><div>涓嬮潰鎽樻妱浜嶮SDN銆妔ynchronous file I/O and asynchronous file I/O銆嬨?/div><div>鏈変袱縐嶇被鍨嬬殑鏂囦歡IO鍚屾錛氬悓姝ユ枃浠禝O鍜屽紓姝ユ枃浠禝O銆傚紓姝ユ枃浠禝O涔熷氨鏄噸鍙營O銆?/div><div>鍦ㄥ悓姝ユ枃浠禝O涓紝綰跨▼鍚姩涓涓狪O鎿嶄綔鐒跺悗灝辯珛鍗寵繘鍏ョ瓑寰呯姸鎬侊紝鐩村埌IO鎿嶄綔瀹屾垚鍚庢墠閱掓潵緇х畫鎵ц銆傝屽紓姝ユ枃浠禝O鏂瑰紡涓紝綰跨▼鍙戦佷竴涓狪O璇鋒眰鍒板唴鏍革紝鐒跺悗緇х畫澶勭悊鍏朵粬鐨勪簨鎯咃紝鍐呮牳瀹屾垚IO璇鋒眰鍚庯紝灝嗕細閫氱煡綰跨▼IO鎿嶄綔瀹屾垚浜嗐?/div><div> </div><div>濡傛灉IO璇鋒眰闇瑕佸ぇ閲忔椂闂存墽琛岀殑璇濓紝寮傛鏂囦歡IO鏂瑰紡鍙互鏄捐憲鎻愰珮鏁堢巼錛屽洜涓哄湪綰跨▼絳夊緟鐨勮繖孌墊椂闂村唴錛孋PU灝嗕細璋冨害鍏朵粬綰跨▼榪涜鎵ц錛屽鏋滄病 鏈夊叾浠栫嚎紼嬮渶瑕佹墽琛岀殑璇濓紝榪欐鏃墮棿灝嗕細嫻垂鎺夛紙鍙兘浼氳皟搴︽搷浣滅郴緇熺殑闆墮〉綰跨▼錛夈傚鏋淚O璇鋒眰鎿嶄綔寰堝揩錛岀敤寮傛IO鏂瑰紡鍙嶈岃繕浣庢晥錛岃繕涓嶅鐢ㄥ悓姝O鏂?寮忋?/div><div>    鍚屾IO鍦ㄥ悓涓鏃跺埢鍙厑璁鎬竴涓狪O鎿嶄綔錛屼篃灝辨槸璇村浜庡悓涓涓枃浠跺彞鏌勭殑IO鎿嶄綔鏄簭鍒楀寲鐨勶紝鍗充嬌浣跨敤涓や釜綰跨▼涔熶笉鑳藉悓鏃跺鍚屼竴涓枃浠跺彞鏌勫悓鏃跺彂鍑鴻鍐欐搷浣溿傞噸鍙營O鍏佽涓涓垨澶氫釜綰跨▼鍚屾椂鍙戝嚭IO璇鋒眰銆?/div><div>    寮傛IO鍦ㄨ姹傚畬鎴愭椂錛岄氳繃灝嗘枃浠跺彞鏌勮涓烘湁淇″彿鐘舵佹潵閫氱煡搴旂敤紼嬪簭錛屾垨鑰呭簲鐢ㄧ▼搴忛氳繃GetOverlappedResult瀵熺湅IO璇鋒眰鏄惁瀹屾垚錛屼篃鍙互閫氳繃涓涓簨浠跺璞℃潵閫氱煡搴旂敤紼嬪簭銆?/div><div><br></div><div>鍙傝冧功鐩?/div><div><br></div><div>1錛?   MSDN Library </div><div>2錛?   銆奧indows楂樼駭緙栫▼鎸囧崡銆?/div><div>3錛?   銆奧indows鏍稿績緙栫▼銆?/div><div>4錛?   銆奧indows 2000 璁懼椹卞姩紼嬪簭璁捐鎸囧崡銆?/div><div><br></div><div>寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣ㄤ箣浜?APC</div><div><br></div><div>    Alertable IO(鍛婅IO)鎻愪緵浜嗘洿鏈夋晥鐨勫紓姝ラ氱煡褰㈠紡銆俁eadFileEx / WriteFileEx鍦ㄥ彂鍑篒O璇鋒眰鐨勫悓鏃訛紝鎻愪緵涓涓洖璋冨嚱鏁幫紙APC榪囩▼錛夛紝褰揑O璇鋒眰瀹屾垚鍚庯紝涓鏃︾嚎紼嬭繘鍏ュ彲鍛婅鐘舵侊紝鍥炶皟鍑芥暟灝嗕細鎵ц銆?/div><div>    浠ヤ笅浜斾釜鍑芥暟鑳藉浣跨嚎紼嬭繘鍏ュ憡璀︾姸鎬侊細</div><div>    SleepEx</div><div>    WaitForSingleObjectEx</div><div>    WaitForMultipleObjectsEx</div><div>    SignalObjectAndWait</div><div>    MsgWaitForMultipleObjectsEx</div><div>    綰?紼嬭繘鍏ュ憡璀︾姸鎬佹椂錛屽唴鏍稿皢浼氭鏌ョ嚎紼嬬殑APC闃熷垪錛屽鏋滈槦鍒椾腑鏈堿PC錛屽皢浼氭寜FIFO鏂瑰紡渚濇鎵ц銆傚鏋滈槦鍒椾負絀猴紝綰跨▼灝嗕細鎸傝搗絳夊緟浜嬩歡瀵硅薄銆備互鍚庣殑鏌?涓椂鍒伙紝涓鏃PC榪涘叆闃熷垪錛岀嚎紼嬪皢浼氳鍞ら啋鎵цAPC錛屽悓鏃剁瓑寰呭嚱鏁拌繑鍥濿AIT_IO_COMPLETION銆?/div><div>    QueueUserAPC鍙互鐢ㄦ潵浜轟負鎶曢扐PC錛屽彧瑕佺洰鏍囩嚎紼嬪浜庡憡璀︾姸鎬佹椂錛孉PC灝辮兘澶熷緱鍒版墽琛屻?/div><div>    浣跨敤鍛婅IO鐨勪富瑕佺己鐐規槸鍙戝嚭IO璇鋒眰鐨勭嚎紼嬩篃蹇呴』鏄鐞嗙粨鏋滅殑綰跨▼錛屽鏋滀竴涓嚎紼嬮鍑烘椂榪樻湁鏈畬鎴愮殑IO璇鋒眰錛岄偅涔堝簲鐢ㄧ▼搴忓皢姘歌繙涓㈠けIO瀹屾垚閫氱煡銆傜劧鑰屼互鍚庢垜浠皢浼氱湅鍒癐O瀹屾垚绔彛娌℃湁榪欎釜闄愬埗銆?/div><div>    涓嬮潰鐨勪唬鐮佹紨紺轟簡QueueUserAPC鐨勭敤娉曘?/div><div><br></div><div>/************************************************************************/</div><div>/* APC Test.                                                            */</div><div>/************************************************************************/</div><div><br></div><div>DWORD WINAPI WorkThread(PVOID pParam)</div><div>{</div><div>    HANDLE Event = (HANDLE)pParam;</div><div><br></div><div>    for(;;)</div><div>    {</div><div>        DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE);</div><div>        if(dwRet == WAIT_OBJECT_0)</div><div>            break;</div><div>        else if(dwRet == WAIT_IO_COMPLETION)</div><div>            printf("WAIT_IO_COMPLETION\n");</div><div>    }</div><div><br></div><div>    return 0;</div><div>}</div><div><br></div><div>VOID CALLBACK APCProc(DWORD dwParam)</div><div>{</div><div>    printf("%s", (PVOID)dwParam);</div><div>}</div><div><br></div><div>void TestAPC(BOOL bFast)</div><div>{</div><div>    HANDLE QuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);</div><div><br></div><div>    HANDLE hThread = CreateThread(NULL,</div><div>        0,</div><div>        WorkThread,</div><div>        (PVOID)QuitEvent,</div><div>        0,</div><div>        NULL);</div><div><br></div><div>    Sleep(100); // Wait for WorkThread initialized.</div><div><br></div><div>    for(int i=5; i>0; i--)</div><div>    {</div><div>        QueueUserAPC(APCProc, hThread, (DWORD)(PVOID)"APC here\n");</div><div><br></div><div>        if(!bFast)</div><div>            Sleep(1000);</div><div>    }</div><div><br></div><div>    SetEvent(QuitEvent);</div><div>    WaitForSingleObject(hThread, INFINITE);</div><div>    CloseHandle(hThread);</div><div>}</div><div><br></div><div><br></div><div>鍙傝冧功鐩?/div><div><br></div><div>1錛?   MSDN Library </div><div>2錛?   銆奧indows楂樼駭緙栫▼鎸囧崡銆?/div><div>3錛?   銆奧indows鏍稿績緙栫▼銆?/div><div>4錛?   銆奧indows 2000 璁懼椹卞姩紼嬪簭璁捐鎸囧崡銆?/div><div><br></div><div><br></div><div>寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣ㄤ箣涓?IO瀹屾垚绔彛</div><div><br></div><div>IO瀹屾垚绔彛</div><div><br></div><div>涓嬮潰鎽樻妱浜嶮SDN銆奍/O Completion Ports銆嬶紝smallfool緲昏瘧錛屽師鏂囪鍙傝僀SDN鏂囨。涓績鏂囩珷銆奍/O Completion Ports銆嬶紝 http://dev.csdn.net/Develop/article/29%5C29240.shtm 銆?/div><div>I/O 瀹屾垚绔彛鏄竴縐嶆満鍒訛紝閫氳繃榪欎釜鏈哄埗錛屽簲鐢ㄧ▼搴忓湪鍚姩鏃朵細棣栧厛鍒涘緩涓涓嚎紼嬫睜錛岀劧鍚庤搴旂敤紼嬪簭浣跨敤綰跨▼姹犲鐞嗗紓姝/O璇鋒眰銆傝繖浜涚嚎紼嬭鍒涘緩鐨勫敮涓鐩殑灝辨槸 鐢ㄤ簬澶勭悊I/O璇鋒眰銆傚浜庡鐞嗗ぇ閲忓茍鍙戝紓姝/O璇鋒眰鐨勫簲鐢ㄧ▼搴忔潵璇達紝鐩告瘮浜庡湪I/O璇鋒眰鍙戠敓鏃跺垱寤虹嚎紼嬫潵璇達紝浣跨敤瀹屾垚绔彛(s)瀹冨氨鍙互鍋氱殑鏇村揩涓旀洿鏈?鏁堢巼銆?/div><div>CreateIoCompletionPort鍑芥暟浼氫嬌涓涓狪/O瀹屾垚绔彛涓庝竴涓垨澶氫釜鏂囦歡鍙ユ焺鍙戠敓鍏寵仈銆傚綋涓庝竴涓畬鎴愮鍙g浉鍏崇殑鏂囦歡鍙ユ焺 涓婂惎鍔ㄧ殑寮傛I/O鎿嶄綔瀹屾垚鏃訛紝涓涓狪/O瀹屾垚鍖呭氨浼氳繘鍏ュ埌璇ュ畬鎴愮鍙g殑闃熷垪涓傚浜庡涓枃浠跺彞鏌勬潵璇達紝榪欑鏈哄埗鍙互鐢ㄦ潵鎶婂鏂囦歡鍙ユ焺鐨勫悓姝ョ偣鏀懼湪鍗曚釜瀵?璞′腑銆傦紙璦涓嬩箣鎰忥紝濡傛灉鎴戜滑闇瑕佸姣忎釜鍙ユ焺鏂囦歡榪涜鍚屾錛屼竴鑸岃█鎴戜滑闇瑕佸涓璞★紙濡傦細Event鏉ュ悓姝ワ級錛岃屾垜浠嬌鐢↖O Complete Port 鏉ュ疄鐜板紓姝ユ搷浣滐紝鎴戜滑鍙互鍚屽涓枃浠剁浉鍏寵仈錛屾瘡褰撲竴涓枃浠朵腑鐨勫紓姝ユ搷浣滃畬鎴愶紝灝變細鎶婁竴涓猚omplete package鏀懼埌闃熷垪涓紝榪欐牱鎴戜滑灝卞彲浠ヤ嬌鐢ㄨ繖涓潵瀹屾垚鎵鏈夋枃浠跺彞鏌勭殑鍚屾錛?/div><div>璋冪敤GetQueuedCompletionStatus鍑芥暟錛屾煇 涓嚎紼嬪氨浼氱瓑寰呬竴涓畬鎴愬寘榪涘叆鍒板畬鎴愮鍙g殑闃熷垪涓紝鑰屼笉鏄洿鎺ョ瓑寰呭紓姝/O璇鋒眰瀹屾垚銆傜嚎紼嬶紙浠級灝變細闃誨浜庡畠浠殑榪愯鍦ㄥ畬鎴愮鍙o紙鎸夌収鍚庤繘鍏堝嚭闃熷垪欏哄簭 鐨勮閲婃斁錛夈傝繖灝辨剰鍛崇潃褰撲竴涓畬鎴愬寘榪涘叆鍒板畬鎴愮鍙g殑闃熷垪涓椂錛岀郴緇熶細閲婃斁鏈榪戣闃誨鍦ㄨ瀹屾垚绔彛鐨勭嚎紼嬨?/div><div>璋冪敤GetQueuedCompletionStatus錛岀嚎紼嬪氨浼氬皢浼氫笌鏌愪釜鎸囧畾鐨勫畬鎴愮鍙e緩绔嬭仈緋伙紝涓鐩村歡緇叾璇ョ嚎紼嬬殑瀛樺湪鍛ㄦ湡錛屾垨琚寚瀹氫簡涓嶅悓鐨勫畬鎴愮鍙o紝鎴栬呴噴鏀句簡涓庡畬鎴愮鍙g殑鑱旂郴銆備竴涓嚎紼嬪彧鑳戒笌鏈澶氫笉瓚呰繃涓涓殑瀹屾垚绔彛鍙戠敓鑱旂郴銆?/div><div>瀹?鎴愮鍙f渶閲嶈鐨勭壒鎬у氨鏄茍鍙戦噺銆傚畬鎴愮鍙g殑騫跺彂閲忓彲浠ュ湪鍒涘緩璇ュ畬鎴愮鍙f椂鎸囧畾銆傝騫跺彂閲忛檺鍒朵簡涓庤瀹屾垚绔彛鐩稿叧鑱旂殑鍙繍琛岀嚎紼嬬殑鏁扮洰銆傚綋涓庤瀹屾垚绔彛鐩稿叧 鑱旂殑鍙繍琛岀嚎紼嬬殑鎬繪暟鐩揪鍒頒簡璇ュ茍鍙戦噺錛岀郴緇熷氨浼氶樆濉炰換浣曚笌璇ュ畬鎴愮鍙g浉鍏寵仈鐨勫悗緇嚎紼嬬殑鎵ц錛岀洿鍒頒笌璇ュ畬鎴愮鍙g浉鍏寵仈鐨勫彲榪愯綰跨▼鏁扮洰涓嬮檷鍒板皬浜庤騫跺彂 閲忎負姝€傛渶鏈夋晥鐨勫亣鎯蟲槸鍙戠敓鍦ㄦ湁瀹屾垚鍖呭湪闃熷垪涓瓑寰咃紝鑰屾病鏈夌瓑寰呰婊¤凍錛屽洜涓烘鏃跺畬鎴愮鍙h揪鍒頒簡鍏跺茍鍙戦噺鐨勬瀬闄愩傛鏃訛紝涓涓鍦ㄨ繍琛屼腑鐨勭嚎紼嬭皟鐢?GetQueuedCompletionStatus鏃訛紝瀹冨氨浼氱珛鍒諱粠闃熷垪涓彇璧拌瀹屾垚鍖呫傝繖鏍峰氨涓嶅瓨鍦ㄧ潃鐜鐨勫垏鎹紝鍥犱負璇ュ浜庤繍琛屼腑鐨勭嚎紼嬪氨浼氳繛緇笉 鏂湴浠庨槦鍒椾腑鍙栬蛋瀹屾垚鍖咃紝鑰屽叾浠栫殑綰跨▼灝變笉鑳借繍琛屼簡銆?/div><div>瀵逛簬騫跺彂閲忔渶濂界殑鎸戦夊煎氨鏄偍璁$畻鏈轟腑CPU鐨勬暟鐩傚鏋滄偍鐨勪簨鍔″鐞嗛渶瑕佷竴涓極闀跨殑璁$畻鏃墮棿錛屼竴涓瘮杈冨ぇ鐨勫茍鍙戦噺鍙互鍏佽鏇村綰跨▼鏉ヨ繍琛屻傝櫧鐒跺畬鎴愭瘡涓簨鍔″鐞嗛渶瑕佽姳璐規洿闀跨殑鏃墮棿錛屼絾鏇村鐨勪簨鍔″彲浠ュ悓鏃惰澶勭悊銆傚浜庡簲鐢ㄧ▼搴忔潵璇達紝寰堝鏄撻氳繃嫻嬭瘯騫跺彂閲忔潵鑾峰緱鏈濂界殑鏁堟灉銆?/div><div>PostQueuedCompletionStatus鍑芥暟鍏佽搴旂敤紼嬪簭鍙互閽堝鑷畾涔夌殑涓撶敤I/O瀹屾垚鍖呰繘琛屾帓闃燂紝鑰屾棤闇鍚姩涓涓紓姝/O鎿嶄綔銆傝繖鐐瑰浜庨氱煡澶栭儴浜嬩歡鐨勫伐浣滆呯嚎紼嬫潵璇村緢鏈夌敤銆?/div><div>鍦ㄦ病鏈夋洿澶氱殑寮曠敤閽堝鏌愪釜瀹屾垚绔彛鏃訛紝闇瑕侀噴鏀捐瀹屾垚绔彛銆傝瀹屾垚绔彛鍙ユ焺浠ュ強涓庤瀹屾垚绔彛鐩稿叧鑱旂殑鎵鏈夋枃浠跺彞鏌勯兘闇瑕佽閲婃斁銆傝皟鐢–loseHandle鍙互閲婃斁瀹屾垚绔彛鐨勫彞鏌勩?/div><div><br></div><div>涓嬮潰鐨勪唬鐮佸埄鐢↖O瀹屾垚绔彛鍋氫簡涓涓畝鍗曠殑綰跨▼姹犮?/div><div><br></div><div>/************************************************************************/</div><div>/* Test IOCompletePort.                                                 */</div><div>/************************************************************************/</div><div><br></div><div>DWORD WINAPI IOCPWorkThread(PVOID pParam)</div><div>{</div><div>    HANDLE CompletePort = (HANDLE)pParam;</div><div>    PVOID UserParam;</div><div>    WORK_ITEM_PROC UserProc;</div><div>    LPOVERLAPPED pOverlapped;</div><div>    </div><div>    for(;;)</div><div>    {</div><div>        BOOL bRet = GetQueuedCompletionStatus(</div><div>            CompletePort,</div><div>            (LPDWORD)&UserParam,</div><div>            (LPDWORD)&UserProc,</div><div>            &pOverlapped,</div><div>            INFINITE);</div><div><br></div><div>        _ASSERT(bRet);</div><div><br></div><div>        if(UserProc == NULL) // Quit signal.</div><div>            break;</div><div><br></div><div>        // execute user's proc.        </div><div>        UserProc(UserParam);        </div><div>    }</div><div><br></div><div>    return 0;</div><div>}</div><div><br></div><div>void TestIOCompletePort(BOOL bWaitMode, LONG ThreadNum)</div><div>{</div><div>    HANDLE CompletePort;</div><div>    OVERLAPPED Overlapped = {0, 0, 0, 0, NULL};</div><div><br></div><div>    CompletePort = CreateIoCompletionPort(</div><div>        INVALID_HANDLE_VALUE,</div><div>        NULL,</div><div>        NULL,</div><div>        0);</div><div>    </div><div>    // Create threads.</div><div>    for(int i=0; i<ThreadNum; i++)</div><div>    {</div><div>        HANDLE hThread = CreateThread(NULL,</div><div>            0,</div><div>            IOCPWorkThread,</div><div>            CompletePort,</div><div>            0,</div><div>            NULL);</div><div><br></div><div>        CloseHandle(hThread);</div><div>    }</div><div><br></div><div><br></div><div>    CompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);</div><div>    BeginTime = GetTickCount();</div><div>    ItemCount = 20;</div><div><br></div><div>    for(i=0; i<20; i++)</div><div>    {</div><div>        PostQueuedCompletionStatus(</div><div>            CompletePort,</div><div>            (DWORD)bWaitMode,</div><div>            (DWORD)UserProc1,</div><div>            &Overlapped);</div><div>    }</div><div>    </div><div>    WaitForSingleObject(CompleteEvent, INFINITE);</div><div>    CloseHandle(CompleteEvent);</div><div><br></div><div><br></div><div>    // Destroy all threads.</div><div>    for(i=0; i<ThreadNum; i++)</div><div>    {</div><div>        PostQueuedCompletionStatus(</div><div>            CompletePort,</div><div>            NULL,</div><div>            NULL,</div><div>            &Overlapped);</div><div>    }</div><div><br></div><div>    Sleep(1000); // wait all thread exit.</div><div><br></div><div>    CloseHandle(CompletePort);</div><div>}</div><div><br></div><div><br></div><div>鍙傝冧功鐩?/div><div><br></div><div>1錛?   MSDN Library </div><div>2錛?   銆奧indows楂樼駭緙栫▼鎸囧崡銆?/div><div>3錛?   銆奧indows鏍稿績緙栫▼銆?/div><div>4錛?   銆奧indows 2000 璁懼椹卞姩紼嬪簭璁捐鎸囧崡銆?/div><div><br></div><div><br></div><div>寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣ㄤ箣鍥?綰跨▼姹?/div><div><br></div><div>綰跨▼姹?/div><div><br></div><div>涓嬮潰鎽樻妱浜嶮SDN銆奣hread Pooling銆嬨?/div><div>鏈?璁稿搴旂敤紼嬪簭鍒涘緩鐨勭嚎紼嬭姳璐逛簡澶ч噺鏃墮棿鍦ㄧ潯鐪犵姸鎬佹潵絳夊緟浜嬩歡鐨勫彂鐢熴傝繕鏈変竴浜涚嚎紼嬭繘鍏ョ潯鐪犵姸鎬佸悗瀹氭湡琚敜閱掍互杞宸ヤ綔鏂瑰紡鏉ユ敼鍙樻垨鑰呮洿鏂扮姸鎬佷俊鎭傜嚎紼嬫睜 鍙互璁╀綘鏇存湁鏁堝湴浣跨敤綰跨▼錛屽畠涓轟綘鐨勫簲鐢ㄧ▼搴忔彁渚涗竴涓敱緋葷粺綆$悊鐨勫伐浣滆呯嚎紼嬫睜銆傝嚦灝戜細鏈変竴涓嚎紼嬫潵鐩戝惉鏀懼埌綰跨▼姹犵殑鎵鏈夌瓑寰呮搷浣滐紝褰撶瓑寰呮搷浣滃畬鎴愬悗錛岀嚎 紼嬫睜涓皢浼氭湁涓涓伐浣滆呯嚎紼嬫潵鎵ц鐩稿簲鐨勫洖璋冨嚱鏁般?/div><div>浣犱篃鍙互鎶婃病鏈夌瓑寰呮搷浣滅殑宸ヤ綔欏圭洰鏀懼埌綰跨▼姹犱腑錛岀敤QueueUserWorkItem鍑芥暟鏉ュ畬鎴愯繖涓伐浣滐紝鎶婅鎵ц鐨勫伐浣滈」鐩嚱鏁伴氳繃涓涓弬鏁頒紶閫掔粰綰跨▼姹犮傚伐浣滈」鐩鏀懼埌綰跨▼姹犱腑鍚庯紝灝變笉鑳藉啀鍙栨秷浜嗐?/div><div>Timer-queue timers鍜孯egistered wait operations涔熶嬌鐢ㄧ嚎紼嬫睜鏉ュ疄鐜般備粬浠殑鍥炶皟鍑芥暟涔熸斁鍦ㄧ嚎紼嬫睜涓備綘涔熷彲浠ョ敤BindIOCompletionCallback鍑芥暟鏉ユ姇閫掍竴涓紓 姝O鎿嶄綔錛屽湪IO瀹屾垚绔彛涓婏紝鍥炶皟鍑芥暟涔熸槸鐢辯嚎紼嬫睜綰跨▼鏉ユ墽琛屻?/div><div>褰撶涓嬈¤皟鐢≦ueueUserWorkItem鍑芥暟鎴栬?BindIOCompletionCallback鍑芥暟鐨勬椂鍊欙紝綰跨▼姹犺鑷姩鍒涘緩錛屾垨鑰匱imer-queue timers鎴栬匯egistered wait operations鏀懼叆鍥炶皟鍑芥暟鐨勬椂鍊欙紝綰跨▼姹犱篃鍙互琚垱寤恒傜嚎紼嬫睜鍙互鍒涘緩鐨勭嚎紼嬫暟閲忎笉闄愶紝浠呭彈闄愪簬鍙敤鐨勫唴瀛橈紝姣忎竴涓嚎紼嬩嬌鐢ㄩ粯璁ょ殑鍒濆鍫嗘爤澶у皬錛?榪愯鍦ㄩ粯璁ょ殑浼樺厛綰т笂銆?/div><div>綰跨▼姹犱腑鏈変袱縐嶇被鍨嬬殑綰跨▼錛欼O綰跨▼鍜岄潪IO綰跨▼銆侷O綰跨▼絳夊緟鍦ㄥ彲鍛婅鐘舵侊紝宸ヤ綔欏圭洰浣滀負APC鏀懼埌IO綰跨▼涓傚鏋滀綘鐨勫伐浣滈」鐩渶瑕佺嚎紼嬫墽琛屽湪鍙鍛婄姸鎬侊紝浣犲簲璇ュ皢瀹冩斁鍒癐O綰跨▼銆?/div><div>闈濱O宸ヤ綔鑰呯嚎紼嬬瓑寰呭湪IO瀹屾垚绔彛涓婏紝浣跨敤闈濱O綰跨▼姣擨O綰跨▼鏁堢巼鏇撮珮錛屼篃灝辨槸璇達紝鍙鏈夊彲鑳界殑璇濓紝灝介噺浣跨敤闈濱O綰跨▼銆侷O綰跨▼鍜岄潪IO綰跨▼鍦ㄥ紓姝O鎿嶄綔娌℃湁瀹屾垚涔嬪墠閮戒笉浼氶鍑恒傜劧鑰岋紝涓嶈鍦ㄩ潪IO綰跨▼涓彂鍑洪渶瑕佸緢闀挎椂闂存墠鑳藉畬鎴愮殑寮傛IO璇鋒眰銆?/div><div>姝?紜嬌鐢ㄧ嚎紼嬫睜鐨勬柟娉曟槸錛屽伐浣滈」鐩嚱鏁頒互鍙婂畠灝嗕細璋冪敤鍒扮殑鎵鏈夊嚱鏁伴兘蹇呴』鏄嚎紼嬫睜瀹夊叏鐨勩傚畨鍏ㄧ殑鍑芥暟涓嶅簲璇ュ亣璁劇嚎紼嬫槸涓嬈℃х嚎紼嬬殑鎴栬呮槸姘鎬箙綰跨▼銆備竴鑸潵 璇達紝搴旇閬垮厤浣跨敤綰跨▼鏈湴瀛樺偍鍜屽彂鍑洪渶瑕佹案涔呯嚎紼嬬殑寮傛IO璋冪敤錛屾瘮濡傝RegNotifyChangeKeyValue鍑芥暟銆傚鏋滈渶瑕佸湪姘鎬箙綰跨▼涓墽琛?榪欐牱鐨勫嚱鏁扮殑璇濓紝鍙互緇橯ueueUserWorkItem浼犻掍竴涓夐」WT_EXECUTEINPERSISTENTTHREAD銆?/div><div>娉ㄦ剰錛岀嚎紼嬫睜涓嶈兘鍏煎COM鐨勫崟綰跨▼濂楅棿錛圫TA錛夋ā鍨嬨?/div><div><br></div><div>    涓轟簡鏇存繁鍏ュ湴璁茶В鎿嶄綔緋葷粺瀹炵幇鐨勭嚎紼嬫睜鐨勪紭瓚婃э紝鎴戜滑棣栧厛灝濊瘯鐫鑷繁瀹炵幇涓涓畝鍗曠殑綰跨▼姹犳ā鍨嬨?/div><div><br></div><div>    浠g爜濡備笅錛?/div><div><br></div><div>/************************************************************************/</div><div>/* Test Our own thread pool.                                            */</div><div>/************************************************************************/</div><div><br></div><div>typedef struct _THREAD_POOL</div><div>{</div><div>    HANDLE QuitEvent;</div><div>    HANDLE WorkItemSemaphore;</div><div><br></div><div>    LONG WorkItemCount;</div><div>    LIST_ENTRY WorkItemHeader;</div><div>    CRITICAL_SECTION WorkItemLock;</div><div><br></div><div>    LONG ThreadNum;</div><div>    HANDLE *ThreadsArray;</div><div><br></div><div>}THREAD_POOL, *PTHREAD_POOL;</div><div><br></div><div>typedef VOID (*WORK_ITEM_PROC)(PVOID Param);</div><div><br></div><div>typedef struct _WORK_ITEM</div><div>{</div><div>    LIST_ENTRY List;</div><div><br></div><div>    WORK_ITEM_PROC UserProc;</div><div>    PVOID UserParam;</div><div>    </div><div>}WORK_ITEM, *PWORK_ITEM;</div><div><br></div><div><br></div><div>DWORD WINAPI WorkerThread(PVOID pParam)</div><div>{</div><div>    PTHREAD_POOL pThreadPool = (PTHREAD_POOL)pParam;</div><div>    HANDLE Events[2];</div><div>    </div><div>    Events[0] = pThreadPool->QuitEvent;</div><div>    Events[1] = pThreadPool->WorkItemSemaphore;</div><div><br></div><div>    for(;;)</div><div>    {</div><div>        DWORD dwRet = WaitForMultipleObjects(2, Events, FALSE, INFINITE);</div><div><br></div><div>        if(dwRet == WAIT_OBJECT_0)</div><div>            break;</div><div><br></div><div>        //</div><div>        // execute user's proc.</div><div>        //</div><div><br></div><div>        else if(dwRet == WAIT_OBJECT_0 +1)</div><div>        {</div><div>            PWORK_ITEM pWorkItem;</div><div>            PLIST_ENTRY pList;</div><div><br></div><div>            EnterCriticalSection(&pThreadPool->WorkItemLock);</div><div>            _ASSERT(!IsListEmpty(&pThreadPool->WorkItemHeader));</div><div>            pList = RemoveHeadList(&pThreadPool->WorkItemHeader);</div><div>            LeaveCriticalSection(&pThreadPool->WorkItemLock);</div><div><br></div><div>            pWorkItem = CONTAINING_RECORD(pList, WORK_ITEM, List);</div><div>            pWorkItem->UserProc(pWorkItem->UserParam);</div><div><br></div><div>            InterlockedDecrement(&pThreadPool->WorkItemCount);</div><div>            free(pWorkItem);</div><div>        }</div><div><br></div><div>        else</div><div>        {</div><div>            _ASSERT(0);</div><div>            break;</div><div>        }</div><div>    }</div><div><br></div><div>    return 0;</div><div>}</div><div><br></div><div>BOOL InitializeThreadPool(PTHREAD_POOL pThreadPool, LONG ThreadNum)</div><div>{</div><div>    pThreadPool->QuitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div>    pThreadPool->WorkItemSemaphore = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL);</div><div>    pThreadPool->WorkItemCount = 0;</div><div>    InitializeListHead(&pThreadPool->WorkItemHeader);</div><div>    InitializeCriticalSection(&pThreadPool->WorkItemLock);</div><div>    pThreadPool->ThreadNum = ThreadNum;</div><div>    pThreadPool->ThreadsArray = (HANDLE*)malloc(sizeof(HANDLE) * ThreadNum);</div><div><br></div><div>    for(int i=0; i<ThreadNum; i++)</div><div>    {</div><div>        pThreadPool->ThreadsArray[i] = CreateThread(NULL, 0, WorkerThread, pThreadPool, 0, NULL);</div><div>    }</div><div><br></div><div>    return TRUE;</div><div>}</div><div><br></div><div>VOID DestroyThreadPool(PTHREAD_POOL pThreadPool)</div><div>{</div><div>    SetEvent(pThreadPool->QuitEvent);</div><div><br></div><div>    for(int i=0; i<pThreadPool->ThreadNum; i++)</div><div>    {</div><div>        WaitForSingleObject(pThreadPool->ThreadsArray[i], INFINITE);</div><div>        CloseHandle(pThreadPool->ThreadsArray[i]);</div><div>    }</div><div><br></div><div>    free(pThreadPool->ThreadsArray);</div><div><br></div><div>    CloseHandle(pThreadPool->QuitEvent);</div><div>    CloseHandle(pThreadPool->WorkItemSemaphore);</div><div>    DeleteCriticalSection(&pThreadPool->WorkItemLock);</div><div><br></div><div>    while(!IsListEmpty(&pThreadPool->WorkItemHeader))</div><div>    {</div><div>        PWORK_ITEM pWorkItem;</div><div>        PLIST_ENTRY pList;</div><div>        </div><div>        pList = RemoveHeadList(&pThreadPool->WorkItemHeader);</div><div>        pWorkItem = CONTAINING_RECORD(pList, WORK_ITEM, List);</div><div>        </div><div>        free(pWorkItem);</div><div>    }</div><div>}</div><div><br></div><div>BOOL PostWorkItem(PTHREAD_POOL pThreadPool, WORK_ITEM_PROC UserProc, PVOID UserParam)</div><div>{</div><div>    PWORK_ITEM pWorkItem = (PWORK_ITEM)malloc(sizeof(WORK_ITEM));</div><div>    if(pWorkItem == NULL)</div><div>        return FALSE;</div><div><br></div><div>    pWorkItem->UserProc = UserProc;</div><div>    pWorkItem->UserParam = UserParam;</div><div><br></div><div>    EnterCriticalSection(&pThreadPool->WorkItemLock);</div><div>    InsertTailList(&pThreadPool->WorkItemHeader, &pWorkItem->List);</div><div>    LeaveCriticalSection(&pThreadPool->WorkItemLock);</div><div><br></div><div>    InterlockedIncrement(&pThreadPool->WorkItemCount);</div><div><br></div><div>    ReleaseSemaphore(pThreadPool->WorkItemSemaphore, 1, NULL);</div><div><br></div><div>    return TRUE;</div><div>}</div><div><br></div><div>VOID UserProc1(PVOID dwParam)</div><div>{</div><div>    WorkItem(dwParam);</div><div>}</div><div><br></div><div>void TestSimpleThreadPool(BOOL bWaitMode, LONG ThreadNum)</div><div>{</div><div>    THREAD_POOL ThreadPool;    </div><div>    InitializeThreadPool(&ThreadPool, ThreadNum);</div><div>    </div><div>    CompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);</div><div>    BeginTime = GetTickCount();</div><div>    ItemCount = 20;</div><div><br></div><div>    for(int i=0; i<20; i++)</div><div>    {</div><div>        PostWorkItem(&ThreadPool, UserProc1, (PVOID)bWaitMode);</div><div>    }</div><div>    </div><div>    WaitForSingleObject(CompleteEvent, INFINITE);</div><div>    CloseHandle(CompleteEvent);</div><div><br></div><div>    DestroyThreadPool(&ThreadPool);</div><div>}</div><div>    鎴戜滑鎶婂伐浣滈」鐩斁鍒頒竴涓槦鍒椾腑錛岀敤涓涓俊鍙烽噺閫氱煡綰跨▼姹狅紝綰跨▼姹犱腑浠繪剰涓涓嚎紼嬪彇鍑哄伐浣滈」鐩潵鎵ц錛屾墽琛屽畬姣曚箣鍚庯紝綰跨▼榪斿洖綰跨▼姹狅紝緇х畫絳夊緟鏂扮殑宸ヤ綔欏圭洰銆?/div><div>    綰跨▼姹犱腑綰跨▼鐨勬暟閲忔槸鍥哄畾鐨勶紝棰勫厛鍒涘緩濂界殑錛屾案涔呯殑綰跨▼錛岀洿鍒伴攢姣佺嚎紼嬫睜鐨勬椂鍊欙紝榪欎簺綰跨▼鎵嶄細琚攢姣併?/div><div>    綰跨▼姹犱腑綰跨▼鑾峰緱宸ヤ綔欏圭洰鐨勬満浼氭槸鍧囩瓑鐨勶紝闅忔満鐨勶紝騫舵病鏈夌壒鍒殑鏂瑰紡淇濊瘉鍝竴涓嚎紼嬪叿鏈夌壒孌婄殑浼樺厛鑾峰緱宸ヤ綔欏圭洰鐨勬満浼氥?/div><div>    鑰屼笖錛屽悓涓鏃跺埢鍙互騫跺彂榪愯鐨勭嚎紼嬫暟鐩病鏈変換浣曢檺瀹氥備簨瀹炰笂錛屽湪鎴戜滑鐨勬墽琛岃綆椾換鍔$殑婕旂ず浠g爜涓紝鎵鏈夌殑綰跨▼閮藉茍鍙戞墽琛屻?/div><div>    涓嬮潰錛屾垜浠啀鏉ョ湅涓涓嬶紝瀹屾垚鍚屾牱鐨勪換鍔★紝緋葷粺鎻愪緵鐨勭嚎紼嬫睜鏄浣曡繍浣滅殑銆?/div><div><br></div><div>/************************************************************************/</div><div>/* QueueWorkItem Test.                                                  */</div><div>/************************************************************************/</div><div><br></div><div>DWORD BeginTime;</div><div>LONG  ItemCount;</div><div>HANDLE CompleteEvent;</div><div><br></div><div>int compute()</div><div>{</div><div>    srand(BeginTime);</div><div><br></div><div>    for(int i=0; i<20 *1000 * 1000; i++)</div><div>        rand();</div><div><br></div><div>    return rand();</div><div>}</div><div><br></div><div>DWORD WINAPI WorkItem(LPVOID lpParameter)</div><div>{</div><div>    BOOL bWaitMode = (BOOL)lpParameter;</div><div><br></div><div>    if(bWaitMode)</div><div>        Sleep(1000);</div><div>    else</div><div>        compute();</div><div><br></div><div>    if(InterlockedDecrement(&ItemCount) == 0)</div><div>    {</div><div>        printf("Time total %d second.\n", GetTickCount() - BeginTime);</div><div>        SetEvent(CompleteEvent);</div><div>    }</div><div><br></div><div>    return 0;</div><div>}</div><div><br></div><div>void TestWorkItem(BOOL bWaitMode, DWORD Flag)</div><div>{</div><div>    CompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);</div><div>    BeginTime = GetTickCount();</div><div>    ItemCount = 20;</div><div>    </div><div>    for(int i=0; i<20; i++)</div><div>    {</div><div>        QueueUserWorkItem(WorkItem, (PVOID)bWaitMode, Flag);</div><div>    }    </div><div><br></div><div>    WaitForSingleObject(CompleteEvent, INFINITE);</div><div>    CloseHandle(CompleteEvent);</div><div>}</div><div>    寰堢畝鍗曪紝鏄惂錛熸垜浠粎闇瑕佸叧娉ㄤ簬鎴戜滑鐨勫洖璋冨嚱鏁板嵆鍙備絾鏄笌鎴戜滑鐨勭畝鍗曟ā鎷熸潵姣旓紝緋葷粺鎻愪緵鐨勭嚎紼嬫睜鏈夌潃鏇村鐨勪紭鐐廣?/div><div>    棣栧厛錛岀嚎紼嬫睜涓嚎紼嬬殑鏁扮洰鏄姩鎬佽皟鏁寸殑錛屽叾嬈★紝綰跨▼姹犲埄鐢↖O瀹屾垚绔彛鐨勭壒鎬э紝瀹冨彲浠ラ檺鍒跺茍鍙戣繍琛岀殑綰跨▼鏁扮洰錛岄粯璁ゆ儏鍐典笅錛屽皢浼氶檺鍒朵負CPU鐨勬暟鐩紝榪欏彲浠ュ噺灝戠嚎紼嬪垏鎹€傚畠鎸戦夋渶榪戞墽琛岃繃鐨勭嚎紼嬪啀嬈℃姇鍏ユ墽琛岋紝浠庤岄伩鍏嶄簡涓嶅繀瑕佺殑綰跨▼鍒囨崲銆?/div><div>    緋葷粺鎻愪緵鐨勭嚎紼嬫睜鑳屽悗鐨勭瓥鐣ワ紝鎴戜滑涓嬩竴鑺傜戶緇啀璋堛?/div><div><br></div><div>鍙傝冧功鐩?/div><div><br></div><div>1錛?   MSDN Library </div><div>2錛?   銆奧indows楂樼駭緙栫▼鎸囧崡銆?/div><div>3錛?   銆奧indows鏍稿績緙栫▼銆?/div><div>4錛?   銆奧indows 2000 璁懼椹卞姩紼嬪簭璁捐鎸囧崡銆?/div><div><br></div><div><br></div><div>姝f枃</div><div>寮傛IO銆丄PC銆両O瀹屾垚绔彛銆佺嚎紼嬫睜涓庨珮鎬ц兘鏈嶅姟鍣ㄤ箣浜?鏈嶅姟鍣ㄧ殑鎬ц兘鎸囨爣涓庡疄鐜伴珮鎬ц兘鐨勯斿緞</div><div><br></div><div>鏈嶅姟鍣ㄧ殑鎬ц兘鎸囨爣</div><div><br></div><div>    浣滀負涓涓綉緇滄湇鍔″櫒紼嬪簭錛屾ц兘姘歌繙鏄涓浣嶇殑鎸囨爣銆傛ц兘鍙互榪欐牱瀹氫箟錛氬湪緇欏畾鐨勭‖浠舵潯浠跺拰鏃墮棿閲岋紝鑳藉澶勭悊鐨勪換鍔¢噺銆傝兘澶熸渶澶ч檺搴﹀湴鍒╃敤紜歡鎬ц兘鐨勬湇鍔″櫒璁捐鎵嶆槸鑹ソ鐨勮璁°?/div><div>    璁捐鑹ソ鐨勬湇鍔″櫒榪樺簲璇ヨ冭檻騫沖潎鏈嶅姟錛屽浜庢瘡涓涓鎴風錛屾湇鍔″櫒搴旇緇欎簣姣忎釜瀹㈡埛绔鉤鍧囩殑鏈嶅姟錛屼笉鑳借鏌愪竴涓鎴風闀挎椂闂村緱涓嶅埌鏈嶅姟鑰屽彂鐢?#8220;楗ラタ”鐨勭姸鍐點?/div><div>    鍙幾緙╂э紝涔熷氨鏄錛岄殢鐫紜歡鑳藉姏鐨勬彁楂橈紝鏈嶅姟鍣ㄧ殑鎬ц兘鑳藉闅忎箣鍛堢嚎鎬у闀褲?/div><div><br></div><div>瀹炵幇楂樻ц兘鐨勯斿緞</div><div><br></div><div>    涓 涓疄闄呯殑鏈嶅姟鍣ㄧ殑璁$畻鏄緢澶嶆潅鐨勶紝寰寰鏄販鍚堜簡IO璁$畻鍜孋PU璁$畻銆侷O璁$畻鎸囪綆椾換鍔′腑浠O涓轟富鐨勮綆楁ā鍨嬶紝姣斿鏂囦歡鏈嶅姟鍣ㄣ侀偖浠舵湇鍔″櫒絳夛紝娣峰悎浜?澶ч噺鐨勭綉緇淚O鍜屾枃浠禝O錛汣PU璁$畻鎸囪綆椾換鍔′腑娌℃湁鎴栧緢灝戞湁IO錛屾瘮濡傚姞瀵?瑙e瘑錛岀紪鐮?瑙g爜錛屾暟瀛﹁綆楃瓑絳夈?/div><div>    鍦–PU璁$畻涓紝鍗曠嚎 紼嬪拰澶氱嚎紼嬫ā鍨嬫晥鏋滄槸鐩稿綋鐨勩傘奧in32澶氱嚎紼嬬殑鎬ц兘銆嬩腑璇?#8220;鍦ㄤ竴涓崟澶勭悊鍣ㄧ殑璁$畻鏈轟腑錛屽熀浜?CPU 鐨勪換鍔$殑騫跺彂鎵ц閫熷害涓嶅彲鑳芥瘮涓茶鎵ц閫熷害蹇紝浣嗘槸鎴戜滑鍙互鐪嬪埌錛屽湪 Windows NT 涓嬬嚎紼嬪垱寤哄拰鍒囨崲鐨勯澶栧紑閿闈炲父灝忥紱瀵逛簬闈炲父鐭殑璁$畻錛屽茍鍙戞墽琛屼粎浠呮瘮涓茶鎵ц鎱?10%錛岃岄殢鐫璁$畻闀垮害鐨勫鍔狅紝榪欎袱涓椂闂村氨闈炲父鎺ヨ繎浜嗐?#8221;</div><div>    鍙錛屽浜庣函綺圭殑CPU璁$畻鏉ヨ錛屽鏋滃彧鏈変竴涓狢PU錛屽綰跨▼妯″瀷鏄笉鍚堥傜殑銆傝冭檻涓涓墽琛屽瘑闆嗙殑CPU璁$畻鐨勬湇鍔★紝濡傛灉鏈夊嚑鍗佷釜榪欐牱鐨勭嚎紼嬪茍鍙戞墽琛岋紝榪囦簬棰戠箒鍦頒換鍔″垏鎹㈠鑷翠簡涓嶅繀瑕佺殑鎬ц兘鎹熷け銆?/div><div>    鍦?緙栫▼瀹炵幇涓婏紝鍗曠嚎紼嬫ā鍨嬭綆楁ā鍨嬪浜庢湇鍔″櫒紼嬪簭璁捐鏄緢涓嶆柟渚跨殑銆傚洜姝わ紝瀵逛簬CPU璁$畻閲囩敤綰跨▼姹犲伐浣滄ā鍨嬫槸姣旇緝鎭板綋鐨勩?QueueUserWorkItem鍑芥暟闈炲父閫傚悎浜庡皢涓涓狢PU璁$畻鏀懼叆綰跨▼姹犮傜嚎紼嬫睜瀹炵幇灝嗕細鍔姏鍑忓皯榪欑涓嶅繀瑕佺殑綰跨▼鍒囨崲錛岃屼笖鎺у埗騫跺彂綰跨▼鐨勬暟鐩負 CPU鐨勬暟鐩?/div><div>    鎴戜滑鐪熸闇瑕佸叧蹇冪殑鏄疘O璁$畻錛屼竴鑸殑緗戠粶鏈嶅姟鍣ㄧ▼搴忓線寰浼撮殢鐫澶ч噺鐨処O璁$畻銆傛彁楂樻ц兘鐨勯斿緞鍦ㄤ簬瑕侀伩鍏嶇瓑寰匢O 鐨勭粨鏉燂紝閫犳垚CPU絀洪棽錛岃灝介噺鍒╃敤紜歡鑳藉姏錛岃涓涓垨澶氫釜IO璁懼涓嶤PU騫跺彂鎵ц銆傚墠闈粙緇嶇殑寮傛IO錛孉PC錛孖O瀹屾垚绔彛閮藉彲浠ヨ揪鍒拌繖涓洰鐨勩?/div><div>    瀵?浜庣綉緇滄湇鍔″櫒鏉ヨ錛屽鏋滃鎴風騫跺彂璇鋒眰鏁扮洰姣旇緝灝戠殑璇濓紝鐢ㄧ畝鍗曠殑澶氱嚎紼嬫ā鍨嬪氨鍙互搴斾粯浜嗐傚鏋滀竴涓嚎紼嬪洜涓虹瓑寰匢O鎿嶄綔瀹屾垚鑰岃鎸傝搗錛屾搷浣滅郴緇熷皢浼氳皟搴﹀彟 澶栦竴涓氨緇殑綰跨▼鎶曞叆榪愯錛屼粠鑰屽艦鎴愬茍鍙戞墽琛屻傜粡鍏哥殑緗戠粶鏈嶅姟鍣ㄩ昏緫澶у閲囩敤澶氱嚎紼?澶氳繘紼嬫柟寮忥紝鍦ㄤ竴涓鎴風鍙戣搗鍒版湇鍔″櫒鐨勮繛鎺ユ椂錛屾湇鍔″櫒灝嗕細鍒涘緩涓涓?綰跨▼錛岃榪欎釜鏂扮殑綰跨▼鏉ュ鐞嗗悗緇簨鍔°傝繖縐嶄互涓涓笓闂ㄧ殑綰跨▼/榪涚▼鏉ヤ唬琛ㄤ竴涓鎴風瀵硅薄鐨勭紪紼嬫柟娉曢潪甯哥洿瑙傦紝鏄撲簬鐞嗚В銆?/div><div>    瀵逛簬澶у瀷緗戠粶鏈嶅姟 鍣ㄧ▼搴忔潵璇達紝榪欑鏂瑰紡瀛樺湪鐫灞闄愭с傞鍏堬紝鍒涘緩綰跨▼/榪涚▼鍜岄攢姣佺嚎紼?榪涚▼鐨勪唬浠烽潪甯擱珮鏄傦紝灝ゅ叾鏄湪鏈嶅姟鍣ㄩ噰鐢═CP“鐭繛鎺?#8221;鏂瑰紡鎴朥DP鏂瑰紡閫氳鐨勬儏 鍐典笅錛屼緥濡傦紝HTTP鍗忚涓紝瀹㈡埛绔彂璧蜂竴涓繛鎺ュ悗錛屽彂閫佷竴涓姹傦紝鏈嶅姟鍣ㄥ洖搴斾簡榪欎釜璇鋒眰鍚庯紝榪炴帴涔熷氨琚叧闂簡銆傚鏋滈噰鐢ㄧ粡鍏告柟寮忚璁TTP鏈嶅姟鍣紝閭?涔堣繃浜庨綣佸湴鍒涘緩綰跨▼/閿姣佺嚎紼嬪鎬ц兘閫犳垚鐨勫獎鍝嶆槸寰堟伓鍔g殑銆?/div><div>    鍏舵錛屽嵆浣夸竴涓崗璁腑閲囧彇TCP“闀胯繛鎺?#8221;錛屽鎴風榪炰笂鏈嶅姟鍣ㄥ悗灝變竴鐩翠繚鎸?姝よ繛鎺ワ紝緇忓吀鐨勮璁℃柟寮忎篃鏄湁寮婄梾鐨勩傚鏋滃鎴風騫跺彂璇鋒眰閲忓緢楂橈紝鍚屼竴鏃跺埢鏈夊緢澶氬鎴風絳夊緟鏈嶅姟鍣ㄥ搷搴旂殑鎯呭喌涓嬶紝灝嗕細鏈夎繃澶氱殑綰跨▼騫跺彂鎵ц錛岄綣佺殑綰跨▼鍒?鎹㈠皢鐢ㄦ帀涓閮ㄥ垎璁$畻鑳藉姏銆傚疄闄呬笂錛屽鏋滃茍鍙戠嚎紼嬫暟鐩繃澶氱殑璇濓紝寰寰浼氳繃鏃╁湴鑰楀敖鐗╃悊鍐呭瓨錛岀粷澶ч儴鍒嗘椂闂磋楄垂鍦ㄧ嚎紼嬪垏鎹笂錛屽洜涓虹嚎紼嬪垏鎹㈢殑鍚屾椂涔熷皢寮曡搗鍐呭瓨 璋冮〉銆傛渶緇堝鑷存湇鍔″櫒鎬ц兘鎬ュ墽涓嬮檷錛?/div><div>    瀵逛簬涓涓渶瑕佸簲浠樺悓鏃舵湁澶ч噺瀹㈡埛绔茍鍙戣姹傜殑緗戠粶鏈嶅姟鍣ㄦ潵璇達紝綰跨▼姹犳槸鍞竴鐨勮В鍐蟲柟妗堛傜嚎紼嬫睜涓嶅厜鑳藉閬垮厤棰戠箒鍦板垱寤虹嚎紼嬪拰閿姣佺嚎紼嬶紝鑰屼笖鑳藉鐢ㄦ暟鐩緢灝戠殑綰跨▼灝卞彲浠ュ鐞嗗ぇ閲忓鎴風騫跺彂璇鋒眰銆?/div><div>    鍊煎緱娉ㄦ剰鐨勬槸錛屽浜庝竴涓帇鍔涗笉澶х殑緗戠粶鏈嶅姟鍣ㄧ▼搴忚璁★紝鎴戜滑騫朵笉鎺ㄨ崘浠ヤ笂浠諱綍鎶宸с傚湪綆鍗曠殑璁捐灝辮兘澶熷畬鎴愪換鍔$殑鎯呭喌涓嬶紝鎶婁簨鎯呭紕寰楀緢澶嶆潅鏄緢涓嶆槑鏅猴紝寰堟剼锠㈢殑琛屼負銆?/div><div>from:</div><div>http://blog.chinaunix.net/u2/67780/showart_2057137.html</div><div>鍘熸枃鍦板潃 http://blog.chinaunix.net/u/14774/showart_88161.html</div></strong></span></font></div><img src ="http://www.shnenglu.com/beautykingdom/aggbug/104762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-01-04 15:21 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/01/04/104762.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title> windows鏃墮棿澶у叏錛坺z錛?/title><link>http://www.shnenglu.com/beautykingdom/archive/2009/02/06/73148.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Fri, 06 Feb 2009 15:32:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2009/02/06/73148.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/73148.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2009/02/06/73148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/73148.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/73148.html</trackback:ping><description><![CDATA[<div>浠嬬粛</div> <div><span>       </span>鎴戜滑鍦ㄨ 閲忎竴涓嚱鏁拌繍琛屾椂闂達紝鎴栬呭垽鏂竴涓畻娉曠殑鏃墮棿鏁堢巼錛屾垨鑰呭湪紼嬪簭涓垜浠渶瑕佷竴涓畾鏃跺櫒錛屽畾鏃舵墽琛屼竴涓壒瀹氱殑鎿嶄綔錛屾瘮濡傚湪澶氬獟浣撲腑錛屾瘮濡傚湪娓告垙涓瓑錛岄兘浼氱敤鍒版椂闂村嚱鏁般傝繕姣斿鎴戜滑閫氳繃璁板綍鍑芥暟鎴栬呯畻娉曞紑濮嬪拰鎴嚦鐨勬椂闂達紝鐒跺悗鍒╃敤涓よ呬箣宸緱鍑哄嚱鏁版垨鑰呯畻娉曠殑榪愯鏃墮棿銆傜紪璇戝櫒鍜屾搷浣滅郴緇熶負鎴戜滑鎻愪緵浜嗗緢澶氭椂闂村嚱鏁幫紝榪欎簺鏃墮棿鍑芥暟鐨勭簿搴︿篃鏄悇涓嶇浉鍚岀殑錛屾墍浠ワ紝濡傛灉鎴戜滑鎯沖緱鍒板噯紜殑緇撴灉錛屽繀欏諱嬌鐢ㄥ悎閫傜殑鏃墮棿鍑芥暟銆傜幇鍦ㄦ垜灝變粙緇峸indows涓嬬殑鍑犵甯哥敤鏃墮棿鍑芥暟銆?/div> <div><strong>1</strong><strong>錛?/strong><strong>Sleep</strong><strong>鍑芥暟</strong></div> <div style="TEXT-INDENT: 21pt"><strong>浣跨敤錛?/strong>sleep(1000)錛屽湪Windows鍜孡inux涓?000浠h〃鐨勫惈涔夊茍涓嶇浉鍚岋紝Windows涓嬬殑琛ㄧず1000姣錛屼篃灝辨槸1縐掗挓錛汱inux涓嬭〃紺?000縐掞紝Linux涓嬩嬌鐢ㄦ縐掔駭鍒殑鍑芥暟鍙互浣跨敤usleep銆?/div> <div style="TEXT-INDENT: 21pt"><strong>鍘熺悊錛?/strong>sleep鍑芥暟鏄嬌璋冪敤sleep鍑芥暟鐨勭嚎紼嬩紤鐪狅紝綰跨▼涓誨姩鏀懼純鏃墮棿鐗囥傚綋緇忚繃鎸囧畾鐨勬椂闂撮棿闅斿悗錛屽啀鍚姩綰跨▼錛岀戶緇墽琛屼唬鐮併係leep鍑芥暟騫朵笉鑳借搗鍒板畾鏃剁殑浣滅敤錛屼富瑕佷綔鐢ㄦ槸寤舵椂銆傚湪涓浜涘綰跨▼涓彲鑳戒細鐪嬪埌sleep(0);鍏朵富瑕佺洰鐨勬槸璁╁嚭鏃墮棿鐗囥?/div> <div style="TEXT-INDENT: 21pt"><strong>綺懼害錛?/strong>sleep鍑芥暟鐨勭簿搴﹂潪甯鎬綆錛屽綋緋葷粺瓚婂繖瀹冪簿搴︿篃灝辮秺浣庯紝鏈夋椂鍊欐垜浠紤鐪?縐掞紝鍙兘3縐掑悗鎵嶈兘緇х畫鎵ц銆傚畠鐨勭簿搴﹀彇鍐充簬綰跨▼鑷韓浼樺厛綰с佸叾浠栫嚎紼嬬殑浼樺厛綰э紝浠ュ強綰跨▼鐨勬暟閲忕瓑鍥犵礌銆?/div> <div><strong>2</strong><strong>錛?/strong><strong>MFC</strong><strong>涓嬬殑</strong><strong>timer</strong><strong>浜嬩歡</strong></div> <div><span>       </span><strong>浣跨敤錛?/strong>1.璋冪敤鍑芥暟SetTimer()璁劇疆瀹氭椂闂撮殧錛屽SetTimer(0,100,NULL)鍗充負璁劇疆100姣鐨勬椂闂撮棿闅旓紱2.鍦ㄥ簲鐢ㄧ▼搴忎腑澧炲姞瀹氭椂鍝嶅簲鍑芥暟OnTimer()錛屽茍鍦ㄨ鍑芥暟涓坊鍔犲搷搴旂殑澶勭悊璇彞錛岀敤鏉ュ畬鎴愭椂闂村埌鏃剁殑鎿嶄綔銆?/div> <div><span>    </span><strong>鍘熺悊錛?/strong>鍚?span>sleep鍑芥暟涓鏍楓備笉鍚岀殑鏄痶imer鏄竴涓畾鏃跺櫒錛屽彲浠ユ寚瀹氬洖璋冨嚱鏁幫紝榛樿涓篛nTimer()鍑芥暟銆?/span></div> <div><span>    </span><strong>綺懼害錛?/strong>timer浜嬩歡鐨勭簿搴﹁寖鍥村湪姣背綰у埆錛岀郴緇熻秺蹇欏叾綺懼害涔熷氨瓚婂樊銆?/div> <div><strong>3</strong><strong>錛?/strong><strong>C</strong><strong>璇█涓嬬殑</strong><strong>Time</strong></div> <div><span>       </span><strong>浣跨敤錛?/strong>time_t t;time(&t);Time鍑芥暟鏄幏鍙栧綋鍓嶆椂闂淬?/div> <div><span>    </span><strong>鍘熺悊錛?/strong>time鍑芥暟涓昏鐢ㄤ簬鑾峰彇褰撳墠鏃墮棿錛屾瘮濡傛垜浠仛涓涓數瀛愭椂閽熺▼搴忥紝灝卞彲浠ヤ嬌鐢ㄦ鍑芥暟錛岃幏鍙栫郴緇熷綋鍓嶇殑鏃墮棿銆?/div> <div><span>    </span><strong>綺懼害錛?/strong>縐掔駭鍒?/div> <div><strong>4</strong><strong>錛?span>COM瀵硅薄涓殑</span></strong><strong>COleDateTime</strong><strong>錛?/strong><strong><span>COleDateTimeSpan</span><strong>綾?/strong></strong></div> <div><strong><span>    </span></strong><strong>浣跨敤錛?/strong>COleDateTime start_time = COleDateTime::GetCurrentTime();</div> <div style="TEXT-INDENT: 21pt" align=left>COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;<br>While(end_time.GetTotalSeconds() < 2)<br>{<br>// 澶勭悊寤舵椂鎴栧畾鏃舵湡闂磋兘澶勭悊鍏朵粬鐨勬秷鎭?br>DoSomething()<br>end_time = COleDateTime::GetCurrentTime-start_time;</div> <div align=left>}</div> <div style="TEXT-INDENT: 21pt" align=left><strong>鍘熺悊錛?/strong>浠ヤ笂浠h〃寤舵椂<span>2縐掞紝鑰岃繖涓ょ鍐呮垜浠彲浠ュ驚鐜皟鐢―oSomething()錛屼粠鑰屽疄鐜板湪</span><span>寤舵椂鐨勬椂鍊欐垜浠篃鑳藉澶勭悊鍏朵粬鐨勫嚱鏁幫紝鎴栬呮秷鎭?/span><span>COleDateTime,COleDateTimeSpan</span><span>鏄?/span><span>MFC</span><span>涓?/span><span>CTime</span><span>錛?/span><span>CTimeSpan</span><span>鍦?/span><span>COM</span><span>涓殑搴旂敤錛屾墍浠ワ紝涓婇潰鐨勬柟娉曞浜?/span><span>CTime</span><span>錛?/span><span>CTimeSpa</span><span>鍚屾牱鏈夋晥銆?/span></div> <div><strong><span>       </span></strong><strong>綺懼害錛?/strong>縐掔駭鍒?/div> <div><strong>5</strong><strong>錛?/strong><strong>C</strong><strong>璇█涓嬬殑鏃墮挓鍛ㄦ湡</strong><strong>clock()</strong></div> <div><span>       </span><strong>浣跨敤錛?/strong><span>   </span><span style="FONT-SIZE: 9pt">clock_t start = clock();<br>              Sleep(100);<br>              clock_t end = clock();<br>          <span style="COLOR: blue">double</span> d = (<span style="COLOR: blue">double</span>)(start - end) / CLOCKS_PER_SEC;</span></div> <div><span>       </span><strong>鍘熺悊錛?/strong>clock()鏄幏鍙栬綆楁満鍚姩鍚庣殑鏃墮棿闂撮殧銆?</div> <div style="TEXT-INDENT: 21pt"><strong>綺懼害錛?/strong>ms綰у埆錛屽浜庣煭鏃墮棿鍐呯殑瀹氭椂鎴栬呭歡鏃跺彲浠ヨ揪鍒癿s綰у埆錛屽浜庢椂闂存瘮杈冮暱鐨勫畾鏃舵垨鑰呭歡榪熺簿搴﹁繕鏄笉澶熴傚湪windows涓婥LOCKS_PER_SEC涓?span>1000銆?/span></div> <div><strong>6</strong><strong>錛?/strong><strong>Windows</strong><strong>涓嬬殑</strong><strong>GetTickCount()</strong></div> <div align=left><strong>浣跨敤錛?/strong> DWORD start = GetTickCount();<br><span>        Sleep(100);<br>        DWORD end = GetTickCount();</span></div> <div style="MARGIN-LEFT: 21pt"><strong>鍘熺悊錛?/strong>GetTickCount()鏄幏鍙栫郴緇熷惎鍔ㄥ悗鐨勬椂闂撮棿闅斻傞氳繃榪涘叆鍑芥暟寮濮嬪畾鏃訛紝鍒伴鍑哄嚱鏁扮粨鏉熷畾鏃訛紝浠庤屽彲浠ュ垽鏂嚭鍑芥暟鐨勬墽琛屾椂闂達紝榪欑鏃墮棿涔熷茍闈炴槸鍑芥暟鎴栬呯畻娉曠殑鐪熷疄鎵ц鏃墮棿錛屽洜涓哄湪鍑芥暟鍜岀畻娉曠嚎紼嬩笉鍙兘涓鐩村崰鐢?span>CPU錛?/span><span>瀵逛簬鎵鏈夊垽鏂墽琛屾椂闂寸殑鍑芥暟閮芥槸涓鏍鳳紝</span>涓嶈繃鍩烘湰涓婂凡緇忓緢鍑嗙‘錛?span>鍙互閫氳繃鏌ヨ榪涜瀹氭椂銆?/span><span>GetTickCount()</span><span>鍜?/span><span>Clock()</span><span>鍑芥暟鏄悜涓繪澘</span><span>BIOS</span><span>瑕?/span><span>real time clock</span><span>鏃墮棿錛屼細鏈変腑鏂駭鐢燂紝浠ュ強寤惰繜闂銆?/span></div> <div style="MARGIN-LEFT: 21pt"><strong>綺懼害錛?/strong>WindowsNT 3.5浠ュ強浠ュ悗鐗堟湰綺懼害鏄?span>10ms錛屽畠鐨勬椂闂寸簿搴︽瘮clock鍑芥暟鐨勮楂橈紝GetTickCount()甯哥敤浜庡濯掍綋涓?/span></div> <div><strong>7</strong><strong>錛?/strong><strong>Windows</strong><strong>涓?span>timeGetTime</span></strong></div> <div style="TEXT-INDENT: 21pt"><strong><span>浣跨敤錛?/span><span>闇瑕佸寘鍚?/span><span style="FONT-SIZE: 8.5pt; COLOR: black">Mmsystem.h</span><span style="FONT-SIZE: 8.5pt; COLOR: black">錛?/span><span style="FONT-SIZE: 8.5pt; COLOR: black">Windows.h</span><span style="FONT-SIZE: 8.5pt; COLOR: black">錛屽姞鍏ラ潤鎬佸簱</span><span style="FONT-SIZE: 8.5pt; COLOR: black">Winmm.lib.</span></strong></div> <div style="MARGIN-LEFT: 42pt; TEXT-INDENT: 21pt">timeBeginPeriod(1);<br><span style="FONT-SIZE: 9pt">DWORD start = timeGetTime();<br>              Sleep(100);<br>          DWORD end = timeGetTime();</span><br>timeEndPeriod(1);<strong><span></span></strong></div> <div style="TEXT-INDENT: 21pt"><strong><span>鍘熺悊錛?/span><span>timeGetTime</span><span>涔熸椂甯哥敤浜庡濯掍綋瀹氭椂鍣ㄤ腑錛屽彲浠ラ氳繃鏌ヨ榪涜瀹氭椂銆傞氳繃鏌ヨ榪涜瀹氭椂錛屾湰韜篃浼氬獎鍝嶅畾鏃跺櫒鐨勫畾鏃剁簿搴︺?/span></strong></div> <div style="TEXT-INDENT: 21pt"><strong><span>綺懼害錛?/span><span>姣</span>錛屼笌GetTickCount()鐩稿綋銆備絾鏄拰GetTickCount鐩告瘮錛宼imeGetTime鍙互閫氳繃timeBeginPeriod錛?span>timeEndPeriod璁劇疆瀹氭椂鍣ㄧ殑鏈灝忚В鏋愮簿搴? timeBeginPeriod,timeEndPeriod蹇呴』鎴愬鍑虹幇銆?/span></strong></div> <div><strong>8</strong><strong>錛?span>windows涓嬬殑</span></strong><strong>timeSetEvent</strong></div> <div style="TEXT-INDENT: 21pt">浣跨敤錛氳繕璁扮殑VC涓嬬殑Timer鍚楋紵Timer鏄竴涓畾鏃跺櫒錛岃屼互涓婃垜浠彁鍒板嚑縐嶆椂闂村嚱鏁版垨鑰呯被鍨嬶紝瀹炵幇瀹氭椂鍔熻兘鍙兘閫氳繃杞鏉ュ疄鐜幫紝涔熷氨鏄繀欏誨彟澶栧垱寤轟竴涓嚎紼嬪崟鐙鐞嗭紝榪欐牱浼氬獎鍝嶅畾鏃剁簿搴︼紝濂藉湪windows鎻愪緵浜嗗唴緗殑瀹氭椂鍣╰imeSetEvent錛屽嚱鏁板師鍨嬩負</div> <div><span>MMRESULT timeSetEvent</span><span>錛?UINT uDelay, //</span><span>浠ユ縐掓寚瀹氫簨浠剁殑鍛ㄦ湡</span><br><span>UINT uResolution, //</span><span>浠ユ縐掓寚瀹氬歡鏃剁殑綺懼害錛屾暟鍊艱秺灝忓畾鏃跺櫒浜嬩歡鍒嗚鯨鐜囪秺楂樸傜己鐪佸間負1ms</span><br><span>LPTIMECALLBACK lpTimeProc, //</span><span>鎸囧悜涓涓洖璋冨嚱鏁?/span><br><span>WORD dwUser, //</span><span>瀛樻斁鐢ㄦ埛鎻愪緵鐨勫洖璋冩暟鎹?/span><br><span>UINT fuEvent </span><span>錛?/ </span>鏍囧織鍙傛暟錛孴IME_ONESHOT錛氭墽琛屼竴嬈★紱TIME_PERIODIC錛氬懆鏈熸ф墽琛?/div> <div><span>       </span>鍏蜂綋搴旂敤鏃訛紝鍙互閫氳繃璋冪敤timeSetEvent()鍑芥暟錛屽皢闇瑕佸懆鏈熸ф墽琛岀殑浠誨姟瀹氫箟鍦?lpFunction鍥炶皟鍑芥暟涓?濡傦細瀹氭椂閲囨牱銆佹帶鍒剁瓑)錛屼粠鑰屽畬鎴愭墍闇澶勭悊鐨勪簨浠躲傞渶瑕佹敞鎰忕殑鏄細浠誨姟澶勭悊鐨勬椂闂翠笉鑳藉ぇ浜庡懆鏈熼棿闅旀椂闂淬傚彟澶栵紝鍦ㄥ畾鏃跺櫒浣跨敤瀹屾瘯鍚庯紝搴斿強鏃惰皟鐢╰imeKillEvent()灝嗕箣閲婃斁銆?/div> <div style="TEXT-INDENT: 21pt"><strong>鍘熺悊錛?/strong>鍙互鐞嗚В涓轟唬鍥炶皟鍑芥暟鐨則imeGetTime</div> <div style="TEXT-INDENT: 21pt"><strong>綺懼害錛?/strong><span>姣</span>錛宼imeSetEvent鍙互閫氳繃timeBeginPeriod錛?span>timeEndPeriod璁劇疆瀹氭椂鍣ㄧ殑鏈灝忚В鏋愮簿搴? timeBeginPeriod,timeEndPeriod蹇呴』鎴愬鍑虹幇銆?/span><br><strong>9</strong><strong>錛氶珮綺懼害鏃舵帶鍑芥暟</strong><strong>QueryPerformanceFrequency</strong><strong>錛?/strong><strong>QueryPerformanceCounter</strong></div> <div style="TEXT-INDENT: 21pt"><strong>浣跨敤錛?/strong><span style="FONT-SIZE: 9pt">LARGE_INTEGER m_nFreq;<br>          LARGE_INTEGER m_nBeginTime;<br>          LARGE_INTEGER nEndTime;<br>          QueryPerformanceFrequency(&m_nFreq); <span style="COLOR: green">// </span></span><span style="FONT-SIZE: 9pt; COLOR: green">鑾峰彇鏃墮挓鍛ㄦ湡</span><br><span style="FONT-SIZE: 9pt">          QueryPerformanceCounter(&m_nBeginTime); <span style="COLOR: green">// </span></span><span style="FONT-SIZE: 9pt; COLOR: green">鑾峰彇鏃墮挓璁℃暟</span><br><span style="FONT-SIZE: 9pt">          Sleep(100);<br>          QueryPerformanceCounter(&nEndTime);<br>     cout << (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;</span></div> <div><strong>鍘熺悊錛?/strong>CPU涓婁篃鏈変竴涓鏁板櫒錛屼互鏈哄櫒鐨?span>clock涓哄崟浣嶏紝鍙互閫氳繃rdtsc璇誨彇錛岃屼笉鐢ㄤ腑鏂紝鍥犳鍏剁簿搴︿笌緋葷粺鏃墮棿鐩稿綋銆?/span></div> <div><strong>綺懼害錛?/strong>璁$畻鏈鴻幏鍙栫‖浠舵敮鎸侊紝綺懼害姣旇緝楂橈紝鍙互閫氳繃瀹冨垽鏂叾浠栨椂闂村嚱鏁扮殑綺懼害鑼冨洿銆?/div> <div><strong>10</strong><strong>灝忕粨錛?/strong>浠ヤ笂鎻愬埌甯哥敤鐨?縐嶆椂闂村嚱鏁幫紝鐢變簬浠栦滑鐨勭敤澶勪笉鍚岋紝鎵浠ヤ粬浠殑綺懼害涔熶笉灝界浉鍚岋紝鎵浠ュ鏋滅畝鍗曠殑寤舵椂鍙互鐢╯leep鍑芥暟錛岀◢寰噯紜殑寤舵椂鍙互浣跨敤clock鍑芥暟錛孏etTickCount鍑芥暟錛屾洿楂樼駭鐨勫疄鐢?timeGetTime鍑芥暟錛涚畝鍗曠殑瀹氭椂浜嬩歡鍙互鐢═imer錛屽噯紜湴鍙互鐢╰imeSetEvent錛涙垨鍙栦竴鑸郴緇熸椂闂村彲浠ラ歵ime錛屾垨鑰?CTime錛屾垨鑰匔OleDateTime錛岃幏鍙栧噯紜殑鏃墮棿鍙互鐢╟lock錛屾垨鑰匞etTickCount鍑芥暟錛屾垨鑰卼imeGetTime鍑芥暟錛岃岃幏鍙栧噯紜湴緋葷粺鏃墮棿瑕佷嬌鐢ㄧ‖浠舵敮鎸佺殑QueryPerformanceFrequency鍑芥暟錛孮ueryPerformanceCounter鍑芥暟銆?/div> <img src ="http://www.shnenglu.com/beautykingdom/aggbug/73148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2009-02-06 23:32 <a href="http://www.shnenglu.com/beautykingdom/archive/2009/02/06/73148.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://www.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://www-485050.com" target="_blank">激情久久久久久久</a>| <a href="http://luoliguo.com" target="_blank">国产精品va在线播放我和闺蜜</a>| <a href="http://www-ss777.com" target="_blank">国产精品亚洲综合一区在线观看</a>| <a href="http://www-544778.com" target="_blank">亚洲免费影视</a>| <a href="http://4322333.com" target="_blank">亚洲综合不卡</a>| <a href="http://playav999.com" target="_blank">在线观看视频免费一区二区三区</a>| <a href="http://04781900.com" target="_blank">美女诱惑黄网站一区</a>| <a href="http://xingmaipet.com" target="_blank">欧美h视频在线</a>| <a href="http://1392266.com" target="_blank">一本色道88久久加勒比精品</a>| <a href="http://changjiucf.com" target="_blank">99国产精品一区</a>| <a href="http://avse98.com" target="_blank">国产一区二区三区高清在线观看</a>| <a href="http://9952222.com" target="_blank">免费观看久久久4p</a>| <a href="http://ccnn33.com" target="_blank">欧美日韩亚洲91</a>| <a href="http://313cq.com" target="_blank">欧美影院在线</a>| <a href="http://7v51.com" target="_blank">欧美**字幕</a>| <a href="http://niceboybao.com" target="_blank">午夜老司机精品</a>| <a href="http://888ppxx.com" target="_blank">亚洲欧美日韩天堂</a>| <a href="http://cabenn.com" target="_blank">久久久精品一品道一区</a>| <a href="http://sxhrdyb.com" target="_blank">欧美日韩在线视频首页</a>| <a href="http://ktt2048.com" target="_blank">午夜国产精品视频免费体验区</a>| <a href="http://ttdy20.com" target="_blank">性久久久久久久</a>| <a href="http://fxsdcj.com" target="_blank">999亚洲国产精</a>| <a href="http://566805.com" target="_blank">亚洲女女做受ⅹxx高潮</a>| <a href="http://by5263.com" target="_blank">最新亚洲电影</a>| <a href="http://poqsoft.com" target="_blank">亚洲欧美在线网</a>| <a href="http://buyiker.com" target="_blank">日韩视频在线观看国产</a>| <a href="http://021-job.com" target="_blank">午夜精品亚洲一区二区三区嫩草</a>| <a href="http://unrealcopgmail.com" target="_blank">亚洲国产精品综合</a>| <a href="http://3dxxoo.com" target="_blank">午夜精品久久久久久久久</a>| <a href="http://596361.com" target="_blank">日韩一级二级三级</a>| <a href="http://ddh345.com" target="_blank">久久精品理论片</a>| <a href="http://fulong-tj.com" target="_blank">亚洲在线成人精品</a>| <a href="http://cpddddcc.com" target="_blank">免费观看不卡av</a>| <a href="http://www-577511.com" target="_blank">久久成人免费视频</a>| <a href="http://6688se.com" target="_blank">欧美日韩专区在线</a>| <a href="http://ad377.com" target="_blank">亚洲高清视频在线</a>| <a href="http://sdjinchuan.com" target="_blank">国产嫩草影院久久久久</a>| <a href="http://16kkkk.com" target="_blank">最新69国产成人精品视频免费</a>| <a href="http://fyfsds.com" target="_blank">国产欧美一区二区三区国产幕精品</a>| <a href="http://481323.com" target="_blank">亚洲高清免费视频</a>| <a href="http://xy3977.com" target="_blank">在线看一区二区</a>| <a href="http://www-4012345.com" target="_blank">午夜精品视频一区</a>| <a href="http://233116.com" target="_blank">亚洲欧美日韩精品久久久久</a>| <a href="http://www-77663.com" target="_blank">欧美成年网站</a>| <a href="http://2387463.com" target="_blank">欧美不卡视频一区发布</a>| <a href="http://xuanxuan88.com" target="_blank">国产女人精品视频</a>| <a href="http://imaben.com" target="_blank">亚洲一区中文</a>| <a href="http://wansilv.com" target="_blank">亚洲在线日韩</a>| <a href="http://lgaoxiao.com" target="_blank">欧美日韩一区二区在线</a>| <a href="http://baoyou118.com" target="_blank">亚洲二区在线视频</a>| <a href="http://862323.com" target="_blank">伊人久久大香线蕉av超碰演员</a>| <a href="http://18loutv.com" target="_blank">亚洲免费婷婷</a>| <a href="http://yeyelu888.com" target="_blank">性色av香蕉一区二区</a>| <a href="http://excellentjy.com" target="_blank">欧美午夜精品久久久久久人妖</a>| <a href="http://o10669.com" target="_blank">亚洲国产aⅴ天堂久久</a>| <a href="http://2938423.com" target="_blank">亚洲电影自拍</a>| <a href="http://mm778899.com" target="_blank">免费在线一区二区</a>| <a href="http://1235656.com" target="_blank">亚洲大片在线</a>| <a href="http://yzsss.com" target="_blank">99这里只有久久精品视频</a>| <a href="http://17ccem.com" target="_blank">欧美v日韩v国产v</a>| <a href="http://021jjjflaw.com" target="_blank">欧美激情在线狂野欧美精品</a>| <a href="http://wwwcc7777.com" target="_blank">亚洲二区在线视频</a>| <a href="http://133255.com" target="_blank">欧美成人性网</a>| <a href="http://www8888803.com" target="_blank">亚洲韩国精品一区</a>| <a href="http://yanuoxun.com" target="_blank">在线亚洲免费</a>| <a href="http://ww4477.com" target="_blank">国产精品久久久久9999</a>| <a href="http://388123cc.com" target="_blank">亚洲午夜久久久久久久久电影网</a>| <a href="http://xxxx43.com" target="_blank">亚洲在线中文字幕</a>| <a href="http://d1112.com" target="_blank">国产精品亚洲综合天堂夜夜</a>| <a href="http://87ssyy.com" target="_blank">欧美一区2区三区4区公司二百</a>| <a href="http://zzzz91.com" target="_blank">欧美一区日本一区韩国一区</a>| <a href="http://6688se.com" target="_blank">国产偷国产偷亚洲高清97cao </a>| <a href="http://mishangmi.com" target="_blank">午夜激情一区</a>| <a href="http://wwwmiya118.com" target="_blank">国产精品影音先锋</a>| <a href="http://mmmm37.com" target="_blank">久久精视频免费在线久久完整在线看</a>| <a href="http://77017w.com" target="_blank">久久蜜桃资源一区二区老牛 </a>| <a href="http://3dmh329.com" target="_blank">欧美成人免费在线观看</a>| <a href="http://www25sds.com" target="_blank">亚洲国产综合91精品麻豆</a>| <a href="http://uu774.com" target="_blank">日韩一级在线</a>| <a href="http://y65v.com" target="_blank">国产精品亚洲视频</a>| <a href="http://www-116036.com" target="_blank">99国产一区</a>| <a href="http://wnboke.com" target="_blank">欧美在线不卡</a>| <a href="http://atmub.com" target="_blank">免费永久网站黄欧美</a>| <a href="http://x1317.com" target="_blank">亚洲精品一区在线</a>| <a href="http://cpddddcc.com" target="_blank">欧美特黄一区</a>| <a href="http://www50050.com" target="_blank">久久精彩视频</a>| <a href="http://leohacks.com" target="_blank">亚洲精品老司机</a>| <a href="http://hafenchen.com" target="_blank">亚洲综合第一</a>| <a href="http://pao449.com" target="_blank">亚洲国产mv</a>| <a href="http://kxm6868.com" target="_blank">欧美视频观看一区</a>| <a href="http://zgztby.com" target="_blank">久久国产手机看片</a>| <a href="http://www-tk8899.com" target="_blank">亚洲人线精品午夜</a>| <a href="http://kpd521.com" target="_blank">久久精品国产一区二区三</a>| <a href="http://668527.com" target="_blank">亚洲日产国产精品</a>| <a href="http://988tz.com" target="_blank">国产精品久久久久久久7电影</a>| <a href="http://shruhan.com" target="_blank">久久精品三级</a>| <a href="http://40346c.com" target="_blank">亚洲最新在线视频</a>| <a href="http://909059c.com" target="_blank">久久在线视频</a>| <a href="http://wilcherish.com" target="_blank">中日韩视频在线观看</a>| <a href="http://666043.com" target="_blank">一区在线影院</a>| <a href="http://dzyhjx.com" target="_blank">国产精品久久久久久久久久免费 </a>| <a href="http://neudlac.com" target="_blank">亚欧美中日韩视频</a>| <a href="http://dh03.com" target="_blank">亚洲精品国产精品国自产观看浪潮</a>| <a href="http://h15h15.com" target="_blank">亚洲欧美不卡</a>| <a href="http://pourporn.com" target="_blank">亚洲国产日韩一区二区</a>| <a href="http://goldure.com" target="_blank">国产精品爽爽ⅴa在线观看</a>| <a href="http://jiucao8.com" target="_blank">久久久久国产精品厨房</a>| <a href="http://y08877.com" target="_blank">一区二区三区视频在线播放</a>| <a href="http://kan0577.com" target="_blank">欧美aⅴ一区二区三区视频</a>| <a href="http://580078.com" target="_blank">亚洲欧美日韩国产综合</a>| <a href="http://huohuoglobal.com" target="_blank">最新国产成人在线观看 </a>| <a href="http://080973.com" target="_blank">蜜臀久久99精品久久久久久9</a>| <a href="http://521mu.com" target="_blank">亚洲少妇诱惑</a>| <a href="http://163263.com" target="_blank">亚洲人妖在线</a>| <a href="http://cswlts.com" target="_blank">欧美黄色大片网站</a>| <a href="http://xiaokd666.com" target="_blank">久久久91精品国产</a>| <a href="http://www16axax.com" target="_blank">亚洲欧美春色</a>| <a href="http://pgpg520.com" target="_blank">日韩一区二区福利</a>| <a href="http://57sa.com" target="_blank">91久久精品国产91久久性色tv </a>| <a href="http://hnspygxjscyfwzx.com" target="_blank">国产欧美日韩一级</a>| <a href="http://yckjwb.com" target="_blank">国产精品va在线播放</a>| <a href="http://017455.com" target="_blank">欧美日本中文</a>| <a href="http://wwwby6682.com" target="_blank">欧美成人中文字幕</a>| <a href="http://yishangsh.com" target="_blank">久久综合99re88久久爱</a>| <a href="http://56qn.com" target="_blank">欧美在线观看天堂一区二区三区</a>| <a href="http://122332.com" target="_blank">宅男噜噜噜66一区二区</a>| <a href="http://maoming365.com" target="_blank">亚洲激情在线</a>| <a href="http://57sa.com" target="_blank">亚洲国产综合在线</a>| <a href="http://hkjccc.com" target="_blank">亚洲二区在线观看</a>| <a href="http://x1317.com" target="_blank">亚洲电影免费观看高清</a>| <a href="http://8xv0.com" target="_blank">欧美成人精品在线播放</a>| <a href="http://woniuminsu.com" target="_blank">久久久久国产成人精品亚洲午夜</a>| <a href="http://0855d.com" target="_blank">欧美一级大片在线免费观看</a>| <a href="http://cmtqd.com" target="_blank">亚洲尤物在线视频观看</a>| <a href="http://yeedeli.com" target="_blank">亚洲午夜精品久久久久久app</a>| <a href="http://www-440450.com" target="_blank">亚洲人成在线免费观看</a>| <a href="http://f9494.com" target="_blank">亚洲精品乱码视频</a>| <a href="http://488918.com" target="_blank">亚洲精品久久久久中文字幕欢迎你</a>| <a href="http://www-136445.com" target="_blank">极品尤物久久久av免费看</a>| <a href="http://sepapapa8888.com" target="_blank">国产女主播视频一区二区</a>| <a href="http://7115866.com" target="_blank">国产九色精品成人porny</a>| <a href="http://223zzz.com" target="_blank">国产精品入口麻豆原神</a>| <a href="http://bkksd.com" target="_blank">国产欧美精品一区aⅴ影院</a>| <a href="http://7ccdd.com" target="_blank">国产精品伊人日日</a>| <a href="http://388123cc.com" target="_blank">国产一区二区无遮挡</a>| <a href="http://6767673.com" target="_blank">国内精品美女在线观看</a>| <a href="http://978769.com" target="_blank">曰韩精品一区二区</a>| <a href="http://xinghejiuye.com" target="_blank">亚洲国产精品va在线看黑人动漫 </a>| <a href="http://2ejj.com" target="_blank">国产精品免费一区二区三区观看</a>| <a href="http://www-87633.com" target="_blank">国产精品乱子久久久久</a>| <a href="http://012928.com" target="_blank">久久香蕉国产线看观看av</a>| <a href="http://4080sy.com" target="_blank">亚洲成人在线网</a>| <a href="http://www40255.com" target="_blank">亚洲成色最大综合在线</a>| <a href="http://012488.com" target="_blank">亚洲精品国产欧美</a>| <a href="http://www-44469.com" target="_blank">一区二区毛片</a>| <a href="http://8x588.com" target="_blank">欧美一区二粉嫩精品国产一线天</a>| <a href="http://clgtzz.com" target="_blank">欧美一级片在线播放</a>| <a href="http://www-236677.com" target="_blank">久久精品国产视频</a>| <a href="http://456985.com" target="_blank">欧美成在线观看</a>| <a href="http://082235.com" target="_blank">欧美亚洲成人免费</a>| <a href="http://66669801.com" target="_blank">国产午夜精品在线观看</a>| <a href="http://0773ye.com" target="_blank">亚洲第一主播视频</a>| <a href="http://hzhzzz.com" target="_blank">一区二区三区免费网站</a>| <a href="http://jizzizz.com" target="_blank">先锋影音久久</a>| <a href="http://shnenglu.com" target="_blank">欧美福利视频一区</a>| <a href="http://www-798009.com" target="_blank">夜夜嗨av一区二区三区网页</a>| <a href="http://cz-sensor.com" target="_blank">亚洲欧美日韩视频二区</a>| <a href="http://012928.com" target="_blank">久久先锋影音</a>| <a href="http://2061826.com" target="_blank">欧美视频二区36p</a>| <a href="http://987gqb.com" target="_blank">国产综合视频</a>| <a href="http://012488.com" target="_blank">99精品国产福利在线观看免费</a>| <a href="http://www11111111.com" target="_blank">亚洲一区二区免费在线</a>| <a href="http://cn1357.com" target="_blank">久久中文字幕一区二区三区</a>| <a href="http://119663.com" target="_blank">亚洲精品偷拍</a>| <a href="http://ssni888.com" target="_blank">欧美一级日韩一级</a>| <a href="http://74w4.com" target="_blank">欧美国产在线观看</a>| <a href="http://gyzhoucheng.com" target="_blank">国产美女精品免费电影</a>| <a href="http://66y3.com" target="_blank">日韩五码在线</a>| <a href="http://baoyou118.com" target="_blank">久久久五月天</a>| <a href="http://www930666.com" target="_blank">日韩视频在线免费</a>| <a href="http://sygxjt.com" target="_blank">久久久久国产精品一区二区</a>| <a href="http://777177c.com" target="_blank">欧美日韩成人在线播放</a>| <a href="http://vpay1314.com" target="_blank">激情久久久久久久</a>| <a href="http://hzdss.com" target="_blank">亚洲欧美日本国产有色</a>| <a href="http://www52y.com" target="_blank">男女激情久久</a>| <a href="http://ruichengxiang.com" target="_blank">亚洲综合二区</a>| <a href="http://318823.com" target="_blank">欧美日韩国产限制</a>| <a href="http://3451215.com" target="_blank">一区二区三区在线视频观看</a>| <a href="http://ythbhg.com" target="_blank">亚洲主播在线观看</a>| <a href="http://www-94889.com" target="_blank">欧美激情一区二区三区高清视频</a>| <a href="http://www49797.com" target="_blank">亚洲在线中文字幕</a>| <a href="http://www-132377.com" target="_blank">欧美精品一区三区在线观看</a>| <a href="http://xsjgxx.com" target="_blank">激情成人综合网</a>| <a href="http://qiezi2vip.com" target="_blank">午夜免费久久久久</a>| <a href="http://xinghejiuye.com" target="_blank">亚洲精品一线二线三线无人区</a>| <a href="http://5xxm.com" target="_blank">久久久久九九九</a>| <a href="http://mmmm37.com" target="_blank">国产午夜精品一区二区三区视频</a>| <a href="http://32tun.com" target="_blank">亚洲一区二区三区四区视频</a>| <a href="http://97gaoba.com" target="_blank">欧美激情日韩</a>| <a href="http://jav1111.com" target="_blank">理论片一区二区在线</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>