璁捐妯″紡- 涓诲姩瀵硅薄锛圓ctive Object锛

璁捐妯″紡- 涓诲姩瀵硅薄锛圓ctive Object锛?
璇戣€呮敞锛?
1.    瀵硅薄鍒嗕负涓诲姩瀵硅薄鍜岃鍔ㄥ璞★紝涓诲姩瀵硅薄鍐呴儴鍖呭惈涓€涓嚎绋嬶紝鍙互鑷姩瀹屾垚鍔ㄤ綔鎴栨敼鍙樼姸鎬侊紝鑰屼竴鑸殑琚姩瀵硅薄鍙兘閫氳繃琚叾浠栧璞¤皟鐢ㄦ墠鏈夋墍浣滀负銆傚湪澶氱嚎绋嬬▼搴忎腑锛岀粡甯告妸涓€涓嚎绋嬪皝瑁呭埌涓诲姩瀵硅薄閲岄潰銆?
2.    鍦ㄧ炕璇戣繃绋嬩腑锛屽彂鐜扮殑鍘熸枃涓嶅Ε澶勮鏇存銆?
3.    鍘熸枃涓澶氬唴瀹逛竴鍐嶉噸澶嶏紝棰囨湁铔囪冻涔嬫劅锛屽彇绮剧敤瀹忥紝鍒犵箒灏辩畝銆?
4.    灏濊瘯鏇撮珮绋嬪害鐨勬剰璇戙€?
鍏抽敭璇?
杩欎釜鏂囩珷浠嬬粛涓诲姩瀵硅薄妯″紡锛屼富鍔ㄥ璞℃槸鍐呴儴鎷ユ湁鑷繁鐨勬帶鍒剁嚎绋嬬殑瀵硅薄銆備负浜嗙畝鍖栧紓姝ヨ皟鐢ㄧ殑澶嶆潅鎬э紝杩欎釜妯″紡鍒嗙浜嗘柟娉曠殑鎵ц鍜岃皟鐢ㄣ€備娇鐢ㄨ繖涓ā寮忥紝涓€涓璞′腑鏃犺鏄惁鏈夌嫭绔嬬殑绾跨▼锛屽鎴蜂粠澶栭儴璁块棶瀹冩椂锛屾劅瑙夋槸涓€鏍风殑銆傜敓浜ц€?娑堣垂鑰咃紝璇昏€?鍐欒€咃紝杩欎袱涓簲鐢ㄥ箍娉涚殑妯″瀷涓紝杩欑绛栫暐闈炲父閫傚悎銆傝繖涓ā寮忓父鐢ㄥ湪澶氱嚎绋嬬殑锛屽垎甯冨紡绯荤粺涓€傚彟澶栵紝涓€浜涘鎴风搴旂敤锛屽锛氳绐楃郴缁熷拰缃戠粶娴忚鍣紝涔熷彲浠ヤ娇鐢ㄤ富鍔ㄥ璞℃ā寮忥紝瀵瑰苟琛岀殑銆佸紓姝ヨ皟璧风殑IO鎿嶄綔绠€鍖栧鐞嗐€?

1    鐩殑
涓诲姩瀵硅薄妯″紡闅旂浜嗘柟娉曟墽琛屽拰鏂规硶璋冪敤鐨勮繃绋嬶紝鎻愰珮浜嗗苟琛屾€э紝瀵瑰唴閮ㄦ嫢鏈夋帶鍒剁嚎绋嬬殑涓诲姩瀵硅薄锛岄檷浣庝簡寮傛璁块棶鐨勫鏉傛€с€?
2    鍒悕
骞惰琛屼负瀵硅薄锛圕oncurrent Object and Actor锛?
3    渚嬪瓙
涓轰簡璇存槑涓诲姩瀵硅薄妯″紡锛岃€冭檻涓€涓€氫俊缃戝叧鐨勮璁°€傜綉鍏抽殧绂讳簰鐩稿崗浣滅殑澶氫釜缁勬垚鍗曞厓锛岃浜や簰杩囩▼涓嶇洿鎺ヤ緷璧栦簬瀵规柟銆傚弬鐓у浘1锛屼竴涓垎甯冨紡绯荤粺涓紝鏉ヨ嚜澶氫釜鐢熶骇鑰咃紙鍗槦璁惧锛夌殑娑堟伅锛岃缃戠杞彂缁欏涓秷璐硅€咃紙灞€鍩熺綉鍐呯殑涓绘満锛夈€?


鎴戜滑鐨勪緥瀛愪腑锛岀敓浜ц€呭拰娑堣垂鑰呬娇鐢═CP鍗忚閫氫俊锛岃繖鏄潰鍚戣繛鎺ョ殑閫氫俊鍗忚銆傜綉鍏充笂鐨勮繘绋嬪悜娑堣垂鑰呭彂閫佹暟鎹椂锛屾搷浣滀細鍙戠敓闃诲銆傝繖鏄洜涓猴紝缃戠粶浼犺緭鑳藉姏鏈夐檺锛孴CP杩涜娴侀噺鎺у埗锛岄槻姝㈣繃閲忕殑鏁版嵁涓嶈兘鍙婃椂缂撳啿鍜屽鐞嗐€?

瑕佹彁楂樻暣浣撶殑鏁堢巼锛岀綉鍏冲鐞嗚繘绋嬩笉鑳藉洜涓€涓繛鎺ヤ笂鐨勯樆濉炶€岀瓑寰呫€傚彟澶栵紝褰撶敓浜ц€呭拰娑堣垂鑰呯殑鏁扮洰澧炲姞鐨勬椂鍊欙紝鏁翠釜杩涚▼蹇呴』鐩稿簲鐨勫鍔犲鐞嗚兘鍔涳紙璇戣€呮敞锛氶€氳繃澧炲姞澶勭悊绾跨▼锛夈€?

涓€涓彁楂樻€ц兘鐨勬湁鏁堟柟娉曪紝灏辨槸浣跨敤骞惰銆傚簲鐢ㄥ苟琛屽悗锛屾湇鍔″璞℃嫢鏈夌嫭绔嬬嚎绋嬶紝绾跨▼瀹為檯瀹屾垚鎿嶄綔锛屽拰鏂规硶璋冪敤鐨勮繃绋嬪垎寮€銆傚苟涓旓紝涓嶅悓绾跨▼澶勭悊涓嶅悓TCP杩炴帴锛屼竴涓繛鎺ヤ笂鐨勭嚎绋嬭闃诲锛屼笉浼氬奖鍝嶅埌鍏朵粬杩炴帴鐨勭嚎绋嬨€?
4    鍦烘櫙
瀵硅薄鐨勮闂€咃紙Client锛屼笅缁熺О涓哄鎴凤級鍜屽璞$殑瀹炵幇鍦ㄤ笉鍚岀殑绾跨▼涓€?
5    闂
璁稿搴旂敤鍦烘櫙锛屾湇鍔¤€呭苟琛屽鐞嗗瀹㈡埛绔殑璇锋眰锛屾彁楂樻湇鍔$殑璐ㄩ噺锛圦oS锛夈€傝鍔ㄥ璞″湪瀹㈡埛绾跨▼涓畬鎴愭搷浣滆繃绋嬶紝涓诲姩瀵硅薄浣跨敤涓撶敤鐨勭嚎绋嬪畬鎴愩€備竴涓璞$殑鏁版嵁琚涓嚎绋嬪叡浜椂锛屽繀椤诲鐞嗗ソ绾跨▼鐨勫悓姝ャ€傝繖瀵艰嚧涓変釜绾︽潫銆?

1.    瀵逛竴涓璞¤皟鐢ㄤ笉鑳介樆濉炴暣涓繘绋嬶紝涓嶈兘褰卞搷鍏朵粬绾跨▼鐨勬墽琛岋細姣斿锛岄€氫俊缃戝叧鐨勪緥瀛愪腑锛屼竴涓猅CP杩炴帴涓婄殑鏁版嵁浼犻€佽闃诲锛屾暣涓繘绋嬩粛鐒惰兘缁х画澶勭悊銆傚悓鏍凤紝鍏朵粬娌℃湁琚樆濉炵殑缃戠粶杩炴帴锛屽簲璇ユ甯哥殑鍙戦€佹暟鎹€?
2.    瀵瑰叡浜璞″悓姝ヨ闂殑閫昏緫搴旇绠€鍖栵細瀹㈡埛鍦ㄤ娇鐢ㄥ叡浜璞″湴鏃跺€欙紝濡傛灉闈㈠搴曞眰鐨勫悓姝ユ満鍒讹紝蹇呴』璁板緱鍏堣鑾峰彇浜掓枼閿侊紝鍚庤閲婃斁浜掓枼閿侊紝缂栫爜灏辨瘮杈冮夯鐑︺€備竴鑸儏鍐碉紝鍏变韩瀵硅薄鐨勬柟娉曢殣钘忚繖浜涚粏鑺傦紝褰撳涓鎴风嚎绋嬭闂悓涓€涓璞℃椂锛岃繖浜涚害鏉熸槸閫忔槑鐨勩€?
3.    瀛樺湪鍙互骞宠杩涜鐨勬搷浣滐紝璁捐鎴愬悓鏃舵墽琛岋細鍦ㄩ€氫俊缃戝叧鐨勪緥瀛愪腑锛屽悓鏃朵娇鐢ㄥ涓猅CP杩炴帴缁欎笉鍚岀殑娑堣垂鑰呭彂閫佹暟鎹€傚鏋滅綉鍏崇殑杩涚▼鍦ㄥ崟涓嚎绋嬩笂鎵ц锛屽強鏃朵娇鐢ㄥ涓鐞嗗櫒涓嶈兘鏄庢樉鐨勬彁楂樻€ц兘銆?
6    鏂规
瀵规瘡涓€涓姹傚苟鍙戞墽琛岀殑瀵硅薄锛屽垎绂诲叾鏂规硶鐨勮皟鐢ㄥ拰鎵ц銆傝繖鏍凤紝杩欎釜瀵硅薄鐨勫鎴峰氨鍍忔槸璋冪敤涓€涓父瑙勭殑鏂规硶涓€鏍枫€傝繖涓柟娉曪紝鑷姩鎶婁换鍔′氦缁欏彟澶栫殑绾跨▼瀹屾垚鎵ц銆?

涓诲姩瀵硅薄鐨勭粍鎴愶細涓€涓唬鐞嗚€咃紙Proxy锛夊疄鐜板閮ㄧ殑璁块棶鎺ュ彛锛涗竴涓墽琛岃€咃紙Servant锛夈€備唬鐞嗗拰鎵ц鑰呭湪涓嶅悓鐨勭嚎绋嬫墽琛岋紝鍒嗙鏂规硶璋冪敤鍜屾墽琛岀殑杩囩▼锛氫唬鐞嗚€呭湪瀹㈡埛绾跨▼涓璋冪敤鎵ц锛屾墽琛岃€呭湪鍙﹀鐨勭嚎绋嬪畬鎴愭搷浣溿€傝繍琛屾椂锛屼唬鐞嗚€呮妸瀹㈡埛鐨勮皟鐢ㄤ俊鎭皝瑁呪€滆皟鐢ㄨ姹傗€濓紙Method Request锛夛紝閫氳繃璋冨害鑰咃紙Scheduler锛夋妸杩欎釜璇锋眰鏀惧埌涓€涓椿鍔ㄩ槦鍒楋紙Activation Queue锛夈€傝皟搴﹁€呭拰鎵ц鑰呰繍琛屽湪鍙﹀鐨勭嚎绋嬩腑锛岃繖涓嚎绋嬪惎鍔ㄥ悗锛屼笉鏂湴浠庢椿鍔ㄩ槦鍒椾腑寰楀埌鈥滆皟鐢ㄨ姹傗€濆璞★紝娲惧彂缁欐墽琛岃€呭畬鎴愬鎴疯姹傜殑鎿嶄綔銆傚鎴疯皟鐢ㄤ唬鐞嗚€呭悗椹笂寰楀埌涓€涓绾﹀鍣紙Future锛夛紝浠婂悗鍙互閫氳繃杩欎釜棰勭害瀹瑰櫒寰楀埌杩斿洖鐨勭粨鏋溿€?
7    缁撴瀯
涓嬮潰浣跨敤Booch椋庢牸鐨勭被鍥撅紝瀵逛富鍔ㄥ璞$殑缁勬垚缁撴瀯杩涜璇存槑銆傦紙璇戣€呮敞锛氳繖鏄疊ooch鍦ㄣ€婇潰鍚戝璞$殑鍒嗘瀽鍜岃璁°€嬩功涓娇鐢ㄧ殑绫诲浘椋庢牸锛?

鍦ㄨ繖涓ā寮忎腑锛屽叡鏈夊叚涓弬涓庤€呫€?
    浠g悊鑰咃紙Proxy锛?
    浠g悊鑰呭畾涔変簡琚鎴疯皟鐢ㄧ殑鎺ュ彛銆傝繖涓帴鍙f槸鍑芥暟璋冪敤鐨勬柟寮忥紝鑰屼笉鏄儚浼犵粺绾跨▼閫氫俊锛屼娇鐢ㄦ暟鎹紶閫掔殑鏂瑰紡銆傚綋鍑芥暟琚皟鐢ㄧ殑锛屼唬鐞嗚€呮瀯閫犱竴涓€滆皟鐢ㄨ姹傗€濆璞★紝骞舵妸瀹冩斁鍒版椿鍔ㄩ槦鍒椾腑锛岃繖涓€鍒囬兘鍙戠敓鍦ㄥ鎴风嚎绋嬩腑銆?

    璋冪敤璇锋眰锛圡ethod Request锛?
    鈥滆皟鐢ㄨ姹傗€濈敤鏉ヤ繚瀛樼浉鍏冲嚱鏁拌皟鐢ㄧ殑閮ㄤ笂涓嬫枃淇℃伅锛屾瘮濡傚嚱鏁版爣璇嗭紝鍑芥暟鐨勫弬鏁帮紝杩欎簺淇℃伅灏嗗湪涓嶅悓绾跨▼闂翠紶閫掋€備竴涓娊璞$殑鈥滆皟鐢ㄨ姹傗€濈被锛屽畾涔変簡鎵ц娲诲姩瀵硅薄鏂规硶鐨勬帴鍙all銆傚苟涓斿寘鍚竴涓狦uard鍑芥暟锛孏uard鐢ㄦ潵妫€鏌ヨ皟鐢ㄧ殑鏉′欢鏄惁婊¤冻銆傚浠g悊鑰呮彁渚涚殑姣忎竴涓富鍔ㄥ璞℃柟娉曪紝鍦ㄨ闂叾鎵ц鑰呯殑鏃跺€欓渶瑕佹潯浠跺垽鏂€備唬鐞嗚€呰璋冪敤鐨勬椂鍊欎細鍒涘缓鍏蜂綋鈥滆皟鐢ㄨ姹傗€濆璞★紝瀵硅薄涓寘鍚簡鎵ц杩欎釜鏂规硶蹇呴』鐨勫弬鏁板拰鏁版嵁鐨勮繑鍥炴柟寮忋€?

    娲诲姩闃熷垪锛圓ctivation Queue锛?
    杩欎釜闃熷垪缁存姢浜嗕竴涓紦鍐插尯锛堣瘧鑰呮敞锛氫笉涓€瀹氭槸鍏堣繘鍏堝嚭鐨勯槦鍒楋級锛岀紦鍐插尯涓瓨鏀句簡寰呮墽琛岀殑鈥滆皟鐢ㄨ姹傗€濄€傛鏄繖涓槦鍒楀垎绂诲彲瀹㈡埛绾跨▼鍜屾墽琛屾搷浣滅殑绾跨▼銆?

    璋冨害鑰咃紙Scheduler锛?
    璋冨害鑰呯鐞嗘椿鍔ㄩ槦鍒椼€傝皟搴﹁€呭喅瀹氶槦鍒椾腑鐨勫摢涓€涓皟鐢ㄨ姹傚厛琚墽琛屻€傝皟搴︾殑鍐冲畾鍙兘鍐冲畾涓庡涓鍒欙細鍏抽敭瀛楅『搴忥紝鍏ラ槦鐨勯『搴忥紝瑕佹弧瓒崇殑鎵ц鏉′欢鎴栫瓑寰呭彂鐢熺殑浜嬩欢锛屽锛氬湪涓€涓暟鎹粨鏋勪腑鍑虹幇绌洪棽鍖恒€傝皟搴﹁€呬娇鐢℅uard鏂规硶鐨勮皟鐢紝鏉ユ鏌ユ槸鍚︽弧瓒虫墽琛屾潯浠躲€?

    鎵ц鑰咃紙Servant锛?
    鐪熸瀹屾垚鎿嶄綔鐨勫璞°€傛墽琛岃€呭疄闄呭畬鎴愪唬鐞嗚€呭畾涔夌殑涓诲姩瀵硅薄鏂规硶锛屽搷搴斾竴涓€滆皟鐢ㄨ姹傗€濄€傝皟搴﹁€呯粰鈥滆皟鐢ㄨ姹傗€濆垎娲句竴鍏辨墽琛岃€咃紝鐒跺悗璋冪敤鈥滆皟鐢ㄨ姹傗€濅腑鐨凜all鏂规硶銆傚搴旂殑鎵ц鑰呯殑鏂规硶灏嗚璋冪敤銆傛墽琛岃€呯殑鏂规硶杩愯鍦ㄨ皟搴﹁€呯殑绾跨▼涓€傛墽琛岃€呭彲鑳藉悓鏃舵彁渚涗簡涓€浜涙柟娉曚緵鈥滆皟鐢ㄨ姹傗€濆疄鐜癎uard銆?

    棰勭害瀹瑰櫒锛團uture锛?
    褰撴墽琛岃€呭畬鎴愭搷浣滐紝瀹㈡埛閫氳繃棰勭害瀹瑰櫒鑾峰彇杩斿洖缁撴灉銆傚綋瀹㈡埛璋冪敤浠g悊鑰呯殑鏂规硶鍚庯紝涓€鍏辩┖棰勭害瀹瑰櫒椹笂杩斿洖銆傞绾﹀鍣ㄦ寚鍚戜竴鍧楀唴瀛樼┖闂达紝鐢ㄦ潵淇濆瓨杩斿洖缁撴灉銆傚鎴峰彲浠ラ€氳繃杞鎴栭樆濉炶皟鐢ㄧ殑鏂规硶锛岄€氳繃棰勭害瀹瑰櫒寰楀埌杩斿洖缁撴灉銆?
8    杩愯
涓嬮潰鐨勫浘璇存槑浜嗕竴涓皟鐢ㄨ繃绋嬩腑鐨勪笁涓樁娈点€?
娉楋細鍘熷浘涓€渆nqueue(M1)鈥濈殑浣嶇疆鏈夎锛屽叆闃熸搷浣滃簲璇ュ湪杩斿洖Future涔嬪墠锛屾湰鍥惧凡缁忔洿姝c€傞粍鑹茶〃鐜板鎴风嚎绋嬬┖闂达紝缁胯壊琛ㄧず璋冨害鑰呯嚎绋嬬┖闂淬€?

1.    鏋勯€犫€滆皟鐢ㄨ姹傗€濓細鍦ㄨ繖涓樁娈碉紝瀹㈡埛璋冪敤浠g悊鑰呯殑涓€涓柟娉昺1()銆傗€滆皟鐢ㄨ姹傗€濆璞¤鍒涘缓锛岃繖涓璞′腑鍖呭惈浜嗘墍鏈夌殑鍙傛暟銆備唬鐞嗚€呮妸杩欎釜鈥滆皟鐢ㄨ姹傗€濆璞′紶閫掔粰璋冨害鑰咃紝璋冨害鑰呮妸瀹冨叆闃熷埌娲诲姩闃熷垪銆傚鏋滄柟娉昺1()鏈夎繑鍥炲€硷紝灏辫繑鍥炰竴涓绾﹀鍣紙Future锛夛紝鍚﹀垯涓嶈繑鍥炪€?
2.    璋冨害鎵ц锛氳皟搴﹁€呯殑鎵ц绾跨▼涓紝鐩戞帶娲诲姩闃熷垪锛屽綋闃熷垪涓殑涓€涓姹傛弧瓒虫墽琛屾潯浠舵椂锛岃皟搴﹁€呮妸瀹冨嚭闃燂紝鎶婁竴涓墽琛岃€呯粦瀹氬埌杩欎釜璇锋眰涓娿€傜劧鍚庨€氳繃鈥滆皟鐢ㄨ姹傗€濈殑Call鏂规硶锛孋all鍐嶈皟鐢ㄦ墽琛岃€呯殑m1()锛屽畬鎴愬鎴疯姹傜殑鎿嶄綔銆?
3.    瀹屾垚锛氬湪杩欎釜闃舵锛屽鏋滄湁杩斿洖鍊硷紝灏辨妸杩斿洖鍊煎瓨鍌ㄥ埌瀵瑰簲鐨勯绾﹀鍣ㄤ腑銆傜劧鍚庤皟搴﹁€呯嚎绋嬬户缁湪娲诲姩闃熷垪涓煡鎵句笅涓€涓鎵ц鐨勨€滆皟鐢ㄨ姹傗€濄€傚鎴峰氨鍙互鍦ㄩ绾﹀鍣ㄤ腑鎵惧埌杩斿洖鍊笺€傚綋鈥滆皟鐢ㄨ姹傗€濆拰鈥滈绾﹀鍣ㄢ€濅笉鍦ㄤ娇鐢ㄧ殑鏃跺€欙紝娉ㄦ剰閿€姣侊紝闃叉鍐呭瓨婕忔礊銆?
9    瀹炵幇
杩欎竴鑺傝鏄庝竴涓富鍔ㄥ璞℃ā寮忎娇鐢ㄧ殑杩囩▼銆傝繖涓簲鐢ㄦ槸涓婇潰渚嬪瓙鐨勯儴鍒嗗疄鐜般€傚浘2璇存槑浜嗗悇涓粍鎴愰儴鍒嗐€傝繖鑺傜殑渚嬪瓙锛屼娇鐢ㄥ埌浜咥CE妗嗘灦鐨勫彲閲嶇敤缁勪欢銆侫CE鎻愪緵浜嗕赴瀵岀殑鍖呰鍣ㄥ拰妗嗘灦缁勪欢锛岀敤鏉ュ畬鎴愯蒋浠堕棿鐨勯€氫俊浠诲姟锛屽苟涓擜CE鏄法骞冲彴鐨勩€?


1.    鎵ц鑰呯殑瀹炵幇锛氭垜浠殑渚嬪瓙涓紝鎵ц鑰呮槸涓秷鎭槦鍒楋紝鐢ㄦ潵缂撳啿鍙戦€佸埌娑堣垂鑰呯殑娑堟伅銆傚姣忎竴涓繙绋嬬殑娑堣垂鑰咃紝瀵瑰簲涓€涓狢onsumer Handler锛孒andler涓寘鍚竴涓埌娑堣垂鑰呰繘绋嬬殑TCP杩炴帴锛堣瘧鑰呮敞锛氭瘡涓€涓富鍔ㄥ璞¤鍖呰涓€涓狢onsumer Handler锛夈€傛瘡涓€涓狢onsumer Handler瀵瑰簲鐨勬椿鍔ㄥ璞$紦瀛樼殑娑堟伅锛堣瘧鑰咃細閫氳繃娲诲姩闃熷垪缂撳瓨鈥滆姹傝皟鐢ㄢ€滅殑鏂瑰紡缂撳瓨娑堟伅锛夛紝鏄粠鐢熶骇鑰呭彂缁欑綉鍏崇殑锛屽苟涓旂瓑寰呯綉鍏虫妸瀹冨彂閫佺粰瀵瑰簲鐨勬秷璐硅€呫€備笅闈㈢殑绫诲畾涔変簡鎵ц鑰呯殑鎺ュ彛銆?
class MQ_Servant
{
public:
  MQ_Servant (size_t mq_size);
  // 娑堟伅闃熷垪瀹炵幇鐨勬搷浣?
  void put_i (const Message &msg);
  Message get_i (void);
  // 鐘舵€佹鏌?
  bool empty_i (void) const;
  bool full_i (void) const;
private:
  // 鍐呴儴闃熷垪鐨勫疄鐜帮紝鍙兘鏄惊鐜暟缁勶紝閾捐〃涔嬬被
};
put_i鍜実et_i瀹炵幇闃熷垪鐨勬彃鍏ュ拰鍒犻櫎鎿嶄綔銆傚彟澶栫殑涓や釜鍑芥暟锛宔mpty_i鍜宖ull_i鐢ㄦ潵妫€鏌ラ槦鍒楃殑鐘舵€侊紝闃熷垪鍏辨湁涓夌鐘舵€侊紝锛?锛夌┖锛岋紙2锛夋弧锛屽拰锛?锛夐潪绌洪潪婊°€傝繖涓や釜鍑芥暟灏嗗府鍔╁疄鐜扳€滆皟鐢ㄨ姹傗€濈殑Guard锛堬級銆?
娉ㄦ剰锛屾墽琛岃€匨Q_Servant鎶婄嚎绋嬪悓姝ョ殑浠诲姟浜ょ粰浜嗗閮ㄣ€傚湪鎴戜滑鐨勪緥瀛愪腑锛孧Q_Servant娌℃湁鍖呭惈浠讳綍绾跨▼鍚屾鐨勪唬鐮併€傝繖涓被浠呮彁渚涗簡妫€鏌ュ叾鍐呴儴鐘舵€佺殑鏂规硶銆傝繖绉嶈璁¢伩鍏嶄簡鈥淚nheritance anomaly鈥濓紙缁ф壙鍙嶅父锛夐棶棰橈細濡傛灉瑙勫畾浜嗗悓姝ュ疄鐜帮紝浼氬埗绾Q_Servant琚噸鐢ㄣ€傝€岃繖鏍凤紝鍚屾鏂瑰紡鐨勬敼鍙樹笉褰卞搷MQ_Servant鐨勫疄鐜帮紙璇戣€咃細鏀句笅鍗宠嚜鍦級銆?

2.    浠g悊鑰呭拰鈥滆皟鐢ㄨ姹傗€濈殑瀹炵幇锛氫緥瀛愪腑锛屼唬鐞嗚€匨Q_Proxy鎻愪緵浜嗗拰鎵ц鑰匨Q_Servant涓€鏍风殑鎺ュ彛鍑芥暟銆傚彟澶栵紝浠g悊MQ_Proxy鍙堟槸涓€涓垱閫犫€滆皟鐢ㄨ姹傗€濆璞$殑宸ュ巶銆備笅闈㈡槸瀹冪殑C++浠g爜銆?
class MQ_Proxy
{
public:
  //  娑堟伅闃熷垪鐨勯暱搴?
  enum { MAX_SIZE = 100 };
  MQ_Proxy (size_t size = MAX_SIZE)
    : scheduler_ (new MQ_Scheduler (size)),
  servant_ (new MQ_Servant (size)) {}
  // 璋冨害<put> 鍦ㄦ椿鍔ㄥ璞′笂鎵ц
  void put (const Message &m) {
    Method_Request *method_request =
    new Put (servant_, m);
    scheduler_->enqueue (method_request);
  }
  // <Get>杩斿洖棰勭害瀹瑰櫒锛歁essage_Future
  Message_Future get (void) {
    Message_Future result;
    Method_Request *method_request =
      new Get (servant_, result);
    scheduler_->enqueue (method_request);
    return result;
  }
  // ... empty() and full() 鐢ㄦ潵妫€鏌ラ槦鍒楃姸鎬?
protected:
  // 瀹為檯瀹屾垚鎿嶄綔鐨勬墽琛岃€?
  MQ_Servant *servant_;
  // 璋冨害鑰?
  MQ_Scheduler *scheduler_;
};
铏氭嫙鍩虹被Method_Request锛屽畾涔変簡鈥滆皟鐢ㄨ姹傗€濈殑鎺ュ彛锛?
class Method_Request
{
public:
// 妫€鏌ユ槸鍚﹀噯澶囧ソ
virtual bool guard (void) const = 0;
// 鎵ц鎿嶄綔
virtual void call (void) = 0;
};
涓嶅悓鐨勮姹傦紝浣跨敤涓嶅悓鐨勫瓙绫诲畾涔?
class Put : public Method_Request
{
public:
  Put (MQ_Servant *rep,
    Message arg)
    : servant_ (rep), arg_ (arg) {}
  virtual bool guard (void) const {
    // 绾︽潫妫€鏌?
    return !servant_->full_i ();
  }
  virtual void call (void) {
    // 鎻掑叆娑堟伅
    servant_->put_i (arg_);
  }
private:
  MQ_Servant *servant_;
  Message arg_;
};
涓婇潰鐨凣uard鍑芥暟锛屼娇鐢ㄤ簡MQ_Servant鐨刦ull_i鍑芥暟瀹炵幇銆?
鍙﹀涓€涓€滆皟鐢ㄨ姹傗€濆瓙绫伙細
class Get : public Method_Request
{
public:
  Get (MQ_Servant *rep,
    const Message_Future &f)
    : servant_ (rep), result_ (f) {}
  bool guard (void) const {
    // Synchronization constraint:
    // cannot call a <get_i> method until
    // the queue is not empty.
    return !servant_->empty_i ();
  }
  virtual void call (void) {
    // Bind the dequeued message to the
    // future result object.
    result_ = servant_->get_i ();
  }
private:
  MQ_Servant *servant_;
  // Message_Future result value.
  Message_Future result_;
};
杩欎釜瀵硅薄瑕佷娇鐢ㄩ绾﹀鍣紝澶勭悊鏈€缁堣繑鍥炵殑缁撴瀯銆傚叾鍐呴儴淇濆瓨浜嗛绾﹀鍣ㄣ€?

3.    娲诲姩闃熷垪鐨勫疄鐜帮細姣忎竴涓€滆皟鐢ㄨ姹傗€濄€備竴涓吀鍨嬬殑瀹炵幇锛屾槸涓€涓嚎绋嬪畨鍏ㄧ殑缂撳啿鍖恒€備竴鑸繕瑕佸疄鐜伴亶鍘嗗叾鍏冪礌鐨勫惊鐜瓙锛圛terator锛夈€備笅闈㈡槸鏈緥鐨凜++瀹炵幇銆?
class Activation_Queue
{
public:
  // Block for an "infinite" amount of time
  // waiting for <enqueue> and <dequeue> methods
  // to complete.
  const int INFINITE = -1;
  // Define a "trait".
  typedef Activation_Queue_Iterator
  iterator;
  // Constructor creates the queue with the
  // specified high water mark that determines
  // its capacity.
  Activation_Queue (size_t high_water_mark);
  // Insert <method_request> into the queue, waiting
  // up to <msec_timeout> amount of time for space
  // to become available in the queue.
  void enqueue (Method_Request *method_request,
  long msec_timeout = INFINITE);
  // Remove <method_request> from the queue, waiting
  // up to <msec_timeout> amount of time for a
  // <method_request> to appear in the queue.
  void dequeue (Method_Request *method_request,
    long msec_timeout = INFINITE);
private:
  // Synchronization mechanisms, e.g., condition
  // variables and mutexes, and the queue
  // implementation, e.g., an array or a linked
  // list, go here.
  // ...
};
鍏ラ槦鍜屽嚭闃熺殑鎿嶄綔锛屾槸缁忓吀鐨勨€滅敓浜ц€呫€佹秷璐硅€呪€濇ā鍨嬨€傚緢瀹规槗瀹炵幇浜掓枼璁块棶銆?

4.    璋冨害鑰呯殑瀹炵幇锛氳皟搴﹁€呰涓€鑸疄鐜颁竴涓叆闃熸搷浣溿€傝皟搴︽墽琛岀嚎绋嬪嚱鏁般€備竴鑸綔涓洪潤鎬佸嚱鏁板瓨鍦紝璋冪敤dispatch锛屽疄鐜拌皟搴︽墽琛岀嚎绋嬨€?
class MQ_Scheduler
{
public:
  // Initialize the Activation_Queue to have the
  // specified capacity and make the Scheduler
  // run in its own thread of control.
  MQ_Scheduler (size_t high_water_mark);
  // ... Other constructors/destructors, etc.,
  // Insert the Method Request into
  // the Activation_Queue. This method
  // runs in the thread of its client, i.e.,
  // in the Proxy鈥檚 thread.
  void enqueue (Method_Request *method_request) {
    act_queue_->enqueue (method_request);
  }
  // Dispatch the Method Requests on their Servant
  // in the Scheduler鈥檚 thread.
  virtual void dispatch (void);
protected:
  // Queue of pending Method_Requests.
  Activation_Queue *act_queue_;
  // Entry point into the new thread.
  static void *svc_run (void *arg);
};

渚嬪瓙涓紝绾跨▼鐨勫惎鍔ㄥ拰娲诲姩闃熷垪鐨勫垱寤洪兘鍦ㄨ皟搴﹁€呯殑鏋勯€犲嚱鏁伴噷闈細
MQ_Scheduler (size_t high_water_mark)
  : act_queue_ (new Activation_Queue
  (high_water_mark))
{
  // Spawn a separate thread to dispatch
  // method requests.
  Thread_Manager::instance ()->spawn (svc_run,
  this);
}

绾跨▼鍑芥暟闈炲父绠€鍗曪紝灏辨槸璋冪敤Dispatch锛?
void *
MQ_Scheduler::svc_run (void *args)
{
  MQ_Scheduler *this_obj =
    reinterpret_cast<MQ_Scheduler *> (args);
  this_obj->dispatch ();
}

Dispatch鐨勫疄鐜板涓嬶細
virtual void
MQ_Scheduler::dispatch (void)
{
  // Iterate continuously in a
  // separate thread.
  for (;;) {
    Activation_Queue::iterator i;
    // The iterator鈥檚 <begin> call blocks
    // when the <Activation_Queue> is empty.
    for (i = act_queue_->begin ();
    i != act_queue_->end ();
    i++) {
      // Select a Method Request 鈥榤r鈥?
      // whose guard evaluates to true.
      Method_Request *mr = *i;
      if (mr->guard ()) {
        // Remove <mr> from the queue first
        // in case <call> throws an exception.
        act_queue_->dequeue (mr);
        mr->call ();
        delete mr;
      }
    }
  }
}

5.    寮傛璋冪敤浠ュ悗锛屽鎴峰杩斿洖缁撴灉鐨勬娴嬨€傝皟鐢ㄦ椿鍔ㄥ璞$殑瀹㈡埛锛屽浣曡幏鍙栧拰澶勭悊杩斿洖鍊硷紵杩欐湁涓嶅悓鐨勭瓥鐣ャ€傛湁涓嬮潰涓夌杩斿洖鍊肩瓥鐣ャ€?
1)    鍚屾璋冪敤锛岄樆濉炵瓑寰呫€傚鎴风嚎绋嬮樆濉烇紝涓€鐩村埌鎿嶄綔瀹屾垚銆佹暟鎹繑鍥炪€?
2)    鍚屾璋冪敤锛岄檺鏃剁瓑寰呫€傚鎴风嚎绋嬮樆濉烇紝涓€鐩村埌鏁版嵁杩斿洖銆佹暟鎹繑鍥炴垨鑰呭彂鐢熻秴鏃躲€?
3)    寮傛璋冪敤銆傞绾﹀鍣ㄥ璞★紝鎻愪緵鏌愮寮傛鏂瑰紡杩斿洖鏁版嵁鎴栨墽琛屽け璐ヤ俊鎭€?
棰勭害瀹瑰櫒绉嶇殑绌洪棿锛岃澶氫釜绾跨▼鍏变韩锛屽綋鎵€鏈夌殑绾跨▼閮戒笉鍐嶄娇鐢ㄧ殑鏃跺€欙紝鎵嶈兘琚竻绌哄唴瀛樸€傝鐗瑰埆娉ㄦ剰銆?
鍦ㄦ垜浠殑渚嬪瓙绉嶏紝Message_Future濡備笅瀹氫箟锛?
class Message_Future
{
public:
  // Copy constructor binds <this> and <f> to the
  // same <Message_Future_Rep>, which is created if
  // necessary.
  Message_Future (const Message_Future &f);aa
  // Constructor that initializes <Message_Future> to
  // point to <Message> <m> immediately.
  Message_Future (const Message &m);
  // Assignment operator that binds <this> and <f>
  // to the same <Message_Future_Rep>, which is
  // created if necessary.
  void operator= (const Message_Future &f);
  // ... other constructors/destructors, etc.,
  // Type conversion, which blocks
  // waiting to obtain the result of the
  // asynchronous method invocation.
  operator Message ();
};
鍙互浣跨敤寮曠敤璁℃暟鐨勬柟娉曪紝澶勭悊Message鐨勬竻闄ゃ€?

瀹㈡埛閫氳繃棰勭害瀹瑰櫒鑾峰彇鏁版嵁鐨勪袱绉嶆柟寮忥細
绔嬪嵆鏂瑰紡锛?
MQ_Proxy mq;
// ...
// Conversion of Message_Future from the
// get() method into a Message causes the
// thread to block until a message is
// available.
Message msg = mq.get ();
// Transmit message to the consumer.
send (msg);

寤惰繜鏂瑰紡锛?
// Obtain a future (does not block the client).
Message_Future future = mq.get ();
// Do something else here...
// Evaluate future in the conversion operator;
// may block if the result is not available yet.
Message msg = Message (future);
10    瀹屾垚鐨勪緥瀛?
閫氫俊缃戝叧绋嬪簭鍐呴儴锛屽寘鍚敓浜ц€咃紙Supplier锛夊拰娑堣垂鑰咃紙Consumer锛夌殑Handler锛屽畠浠垎鍒槸杩滅▼鐢熶骇鑰呭拰杩滅▼娑堣垂鑰呯殑浠g悊銆傚涓嬮潰鐨勫浘3鎵€绀猴紝鐢熶骇鑰呯殑Handler浠庤繙绋嬭澶囦笂鎺ユ敹娑堟伅锛屽垎鏋愭秷鎭腑鐨勫湴鍧€锛屾牴鎹秷鎭腑鐨勫湴鍧€鏌ユ壘璺敱琛紝纭畾鍝竴涓繙绋嬬殑娑堣垂鑰呭簲璇ユ帴鏀惰繖涓秷鎭€傝矾鐢辫〃缁存姢鍦板潃鍒版秷璐硅€匟andler鐨勫奖灏勫叧绯汇€傛瘡涓秷璐硅€呯殑Handler瀹為檯閫氳繃瀵瑰簲鐨凾CP杩炴帴鎶婃暟鎹€佸嚭銆?

姣忎竴涓秷璐硅€匟andler浣跨敤涓婇潰璁茬殑涓诲姩瀵硅薄鐨勬ā寮忥紝鍐呴儴鍖呭惈涓€涓秷鎭槦鍒楋紙璇戣€咃細閫氳繃淇濆瓨鈥滆皟鐢ㄨ姹傗€濈殑娲诲姩闃熷垪闂存帴瀹炵幇浜嗘秷鎭殑缂撳瓨锛夈€傛潵瀹炵幇娑堟伅鐨勫紓姝ュ彂閫併€?
class Consumer_Handler
{
public:
  Consumer_Handler (void);
  // Put the message into the queue.
  void put (const Message &msg) {
    message_queue_.put (msg);
  }
private:
  // Proxy to the Active Object.
  MQ_Proxy message_queue_;
  // Connection to the remote consumer.
  SOCK_Stream connection_;
  // Entry point into the new thread.
  static void *svc_run (void *arg);
};

鐢熶骇鑰呯殑Handler锛屼娇鐢ㄤ笅闈㈢殑鏂瑰紡锛岀粰娑堣垂鑰呭彂閫佹秷鎭€?
Supplier_Handler::route_message (const Message &msg)
{
  // Locate the appropriate consumer based on the
  // address information in the Message.
  Consumer_Handler *ch =
    routing_table_.find (msg.address ());
  // Put the Message into the Consumer Handler鈥檚 queue.
  ch->put (msg);
};
娑堣垂鑰呯殑Handler锛屽氨鏄疌osumer_Handler锛屽湪鏋勯€犲嚱鏁伴噷闈㈠垱寤哄叾璋冨害澶勭悊绾跨▼銆?
Consumer_Handler::Consumer_Handler (void)
{
  // Spawn a separate thread to get messages
  // from the message queue and send them to
  // the consumer.
  Thread_Manager::instance ()->spawn (svc_run,
  this);
}
涓嬮潰鏄秷璐硅€匟andler鐨勭嚎绋嬪嚱鏁扮殑瀹炵幇
void *
Consumer_Handler::svc_run (void *args)
{
  Consumer_Handler *this_obj =
  reinterpret_cast<Consumer_Handler *> (args);
  for (;;) {
    // Conversion of Message_Future from the
    // get() method into a Message causes the
    // thread to block until a message is
    // available.
    Message msg = this_obj->message_queue_.get ();
    // Transmit message to the consumer.
    this_obj->connection_.send (msg);
  }
}
褰撲竴涓秷璐硅€呯殑缃戠粶浼犻€佽闃诲鐨勬椂鍊欙紝鍙細闃诲鍏跺搴旂殑绾跨▼锛屼笉浼氬奖鍝嶅埌鍏跺畠娑堣垂鑰呯殑Handler鐨勫鐞嗐€?
11    鍙樺寲
闆嗘垚鐨勮皟搴﹁€咃細
鍦ㄥ疄鐜颁富鍔ㄥ璞℃ā寮忕殑鏃跺€欙紝涓轰簡鍑忓皯瀵硅薄鐨勪釜鏁般€傚彲浠ユ妸浠g悊鑰呭拰鎵ц鑰呯殑瑙掕壊閮藉垎娲惧埌璋冨害鑰呰韩涓娿€傜敋鑷斥€滆皟鐢ㄨ姹傗€濈殑Call鍑芥暟涔熷彲浠ョ敱璋冨害鑰呭疄鐜般€傛瘮濡備笅闈㈢殑浠g爜锛屾秷鎭槦鍒椾緥瀛愮殑闆嗘垚瀹炵幇鏂瑰紡銆?
class MQ_Scheduler
{
public:
  MQ_Scheduler (size_t size)
    : act_queue_ (new Activation_Queue (size))
  {}
  // ... other constructors/destructors, etc.,
  void put (const Message &msg) {
    Method_Request *method_request =
    // The <MQ_Scheduler> is the servant.
    new Put (this, msg);
    act_queue_->enqueue (method_request);
  }
  Message_Future get (void) {
    Message_Future result;
    Method_Request *method_request =
    // The <MQ_Scheduler> is the servant.
    new Get (this, result);
    act_queue_->enqueue (method_request);
    return result;
  }
  // ...
private:
  // Message queue servant operations.
  void put_i (const Message &msg);
  Message get_i (void);
  // Predicates.
  bool empty_i (void) const;
  bool full_i (void) const;
  Activation_Queue *act_queue_;
  // ...
};

杩欐牱闆嗘垚鍚庯紝鍑忓皯浜嗙粍浠讹紝瀹炵幇鏇村姞绠€鍖栥€傚綋鐒讹紝杩欐牱涔熷甫鏉ヤ簡缂虹偣锛岃皟搴﹁€呭繀椤荤煡閬撲唬鐞嗚€呭拰鎵ц鑰呯殑鍏蜂綋绫诲瀷锛屽叿浣撳疄鐜般€傝繖鏍峰氨寰堥毦鍦ㄤ笉鍚岀殑娲诲姩瀵硅薄涓紝閲嶇敤璋冨害鑰呫€?

娑堟伅鐨勭洿鎺ヤ紶閫掞細
鏇磋繎涓€姝ョ殑绠€鍖栵紝浠g悊鑰呭拰鎵ц鑰呴兘鍒犻櫎鎺夈€傚湪瀹㈡埛绾跨▼鍜岃皟搴﹁€呯嚎绋嬩箣闂寸洿鎺ヤ娇鐢ㄦ暟鎹殑鏂瑰紡浼犻€掓秷鎭€?
class Scheduler
{
public:
  Scheduler (size_t size)
    : act_queue_ (new Activation_Queue (size))
  {}
  // ... other constructors/destructors, etc.,
  // Enqueue a Message Request in the thread of
  // the client.
  void enqueue (Message_Request *message_request) {
    act_queue_->enqueue (message_request);
  }
  // Dispatch Message Requests in the thread of
  // the Scheduler.
  virtual void dispatch (void) {
    Message_Request *mr;
    // Block waiting for next request to arrive.
    while (act_queue_->dequeue (mr)) {
      // Process the message request <mr>.
    }
  }
  protected:
  Activation_Queue *act_queue_;
  // ...
};
鍥犱负娌℃湁浜嗕唬鐞嗚€咃紝瀹㈡埛鐩存帴鍒涘缓鈥滆皟鐢ㄨ姹傗€濆璞★紝鐒跺悗璋冪敤璋冨害鑰呯殑鍑芥暟鎶婂畠鍏ラ槦鍒版椿鍔ㄩ槦鍒椼€傚悓鏍风殑锛屾病鏈変簡鎵ц鑰咃紝璋冨害鑰呯殑绾跨▼锛屽湪娲诲姩闃熷垪涓緱鍒拌姹傦紝鐩存帴鎵ц瀹屾垚銆?

涓€鑸潵璇达紝杩欐牱杩欐牱瀹炵幇鐨勪竴涓秷鎭紶閫掔殑鏈哄埗锛屾瘮瀹炵幇涓€涓富鍔ㄥ璞¤绠€鍗曠殑澶氥€傛秷鎭紶閫掕繖绉嶅鏉傜殑閫昏緫鐩存帴鏆撮湶缁欏叾瀹㈡埛锛屼笉浣嗗鍔犲紑鍙戠殑闅惧害锛岃繕瀹规槗婊嬬敓BUG锛岃繖鏍锋兂鏉ワ紝涓嶅鎶婅繖绉嶉€昏緫灏佽鍦ㄤ富鍔ㄥ璞$殑鍐呴儴銆傚叿浣撳浣曢€夋嫨锛屾牴鎹疄闄呮儏鍐靛拰鑷繁鐨勫枩濂借€屽畾銆?

棰勭害瀹瑰櫒鐨勬硾鍨嬪疄鐜帮細
涓€涓硾鍨嬬殑棰勭害瀹瑰櫒鍙互浣跨敤杩斿洖鍊肩殑绫诲瀷杩涜瀹氬埗銆傞绾﹀鍣ㄥ疄鐜颁簡涓€涓竴娆″啓澶氭璇荤殑鍚屾鏈哄埗銆傚綋瀹瑰櫒涓殑鍊艰繕娌℃湁鍑嗗濂界殑鏃跺€欙紝瀹㈡埛鐨勮闂搷浣滆闃诲銆傝繖涓硾鍨嬮绾﹀鍣紝閮ㄥ垎瀹炵幇浜嗚鑰?鍐欒€呮ā鍨嬶紝鍙堥儴鍒嗗疄鐜颁簡鐢熶骇鑰?娑堣垂鑰呮ā鍨嬨€?
涓嬮潰鏄疌++妯℃澘瀹炵幇鐨勪緥瀛?
template <class T>
class Future
{
  // This class implements a 鈥榮ingle write, multiple
  // read鈥?pattern that can be used to return results
  // from asynchronous method invocations.
public:
  // Constructor.
  Future (void);
  // Copy constructor that binds <this> and <r> to
  // the same <Future> representation
  Future (const Future<T> &r);
  // Destructor.
  ~Future (void);
  // Assignment operator that binds <this> and
  // <r> to the same <Future>.
  void operator = (const Future<T> &r);
  // Cancel a <Future>. Put the future into its
  // initial state. Returns 0 on success and -1
  // on failure.
  int cancel (void);
  // Type conversion, which obtains the result
  // of the asynchronous method invocation.
  // Will block forever until the result is
  // obtained.
  operator T ();
  // Check if the result is available.
  int ready (void);
private:
  Future_Rep<T> *future_rep_;
  // Future representation implemented using
  // the Counted Pointer idiom.
};
杩欎釜妯℃澘鍙互濡備笅浣跨敤锛?
// Obtain a future (does not block the client).
Future<Message> future = mq.get ();
// Do something else here...
// Evaluate future in the conversion operator;
// may block if the result is not available yet.
Message msg = Message (future);

鍒嗗竷寮忔椿鍔ㄥ璞★細
浠g悊鑰呭拰璋冨害鑰呬箣闂磋法杩囩綉缁溿€備唬鐞嗚€呮妸瑕佹妸鈥滆皟鐢ㄨ姹傗€濆璞″簭鍒楀寲锛岀劧鍚庨€氳繃缃戠粶浼犺緭缁欏彟澶栨満鍣ㄤ笂鐨勮皟搴﹁€咃紝璋冨害鑰呮帴鏀跺苟鍐嶉€犫€滆皟鐢ㄨ姹傗€濆璞°€?

浣跨敤绾跨▼姹狅細
浣跨敤绾跨▼姹狅紝鍙互璁╀竴涓椿鍔ㄥ璞℃敮鎸佸涓墽琛岃€呫€傚涓墽琛岃€呮彁渚涚浉鍚岀殑鏈嶅姟銆傛瘡涓€涓墽琛岃€呰繍琛屽湪涓嶅悓鐨勭嚎绋嬩腑锛岀敱璋冨害鑰呯粺涓€璋冨害锛屽綋鏈夋柊鐨勮姹傛椂锛岃皟搴﹁€呴┈涓婂畨鎺掍竴涓伐浣滅嚎绋嬪伐浣溿€?

12    宸茬煡鐨勫簲鐢?
1.    CORBA ORBS
2.    ACE Framework
3.    Siemens MedCom
4.    Siemens Call Center management system:
5.    Actors
璇戣€咃細姝よ妭鍙垪鍑轰粬浠殑鍚嶅瓧锛屾劅鍏磋叮鐨勫悓蹇楄鍙傝€冨師鏂囥€傚拰鐪嬨€婅璁℃ā寮忋€嬬殑鏃跺€欐儏鍐典竴鏍凤紝鎴戜笉澶叧娉ㄨ繖涓€鑺傘€?
13    鍚庢灉
鏈変笅闈㈢殑濂藉锛?
1.    澧炲己浜嗙▼搴忕殑骞惰鎬э紝闄嶄綆浜嗗悓姝ョ殑澶嶆潅鎬с€傚鎴风嚎绋嬪拰寮傛璋冭捣鎿嶄綔骞惰鎵ц銆傚悓姝ョ殑澶嶆潅鎬х敱璋冨害鑰呯嫭绔嬪鐞嗐€?
2.    璁╁涓€楁椂鐨勬搷浣滃苟琛屾墽琛屻€傚彧瑕佽蒋浠跺拰纭欢鏀寔锛屽彲浠ヨ澶氫釜娲诲姩鐨勫璞″郊姝や笉骞叉壈鍦板悓鏃惰繍琛屻€?
3.    鏂规硶鐨勬墽琛屽拰璋冪敤鐨勯『搴忓彲浠ヤ笉涓€鑷淬€傛柟娉曠殑璋冪敤鏄紓姝ヨ皟鐢ㄣ€傝€屾柟娉曠殑鎵ц鍐冲畾浜庡浣曡皟搴︺€?

褰撶劧锛屼富鍔ㄥ璞′篃鏈変互涓嬭礋闈㈢殑褰卞搷
1.    鎬ц兘杩囧娑堣€楋細绯荤粺娑堣€楃殑绋嬪害鍐冲畾浜庤皟搴﹁€呯殑瀹炵幇銆傜敤鎴锋€佸拰绯荤粺鎬佺殑涓婁笅鏂囧垏鎹紝鍚屾淇″彿鐨勬椂鍊欙紝鏁版嵁鐨勪紶閫侀兘浼氬甫鏉ユ秷鑰椼€備竴鑸鏉ワ紝涓诲姩瀵硅薄妯″紡閫傚悎澶х矑搴︾殑瀵硅薄锛屽寰堝皬鐨勫璞′娇鐢ㄨ繖涓ā寮忓鏄撳甫鏉ユ€ц兘鐨勮繃搴︽秷鑰椼€傝鍜屽叾瀹冨苟鍙戞ā寮忔瘮杈冨鐩戞帶鑰呮ā寮忋€?
2.    澧炲姞璋冭瘯鐨勯毦搴︼細骞跺彂鐨勫鏉傚拰璋冨害鐨勪笉鍙娴嬶紝浼氬鍔犺皟璇曠殑鍥伴毦銆傚苟涓旓紝璁稿璋冭瘯宸ュ叿閮戒笉鑳藉畬鍏ㄧ殑鏀寔骞跺彂绋嬪簭鐨勮皟璇曘€?

14    鏇村鐩稿叧妯″紡
璇戣€咃細杩欎簺妯″紡璁稿鎴戣繕涔熸病鏈夋帴瑙︼紝鍑嗗閫愪釜瀛︿範锛岄珮鍏寸殑璇濊繕浼氱炕璇?
    鐩戞帶鑰咃紙Monitor锛夋ā寮忎娇鐢ㄥ悗锛屾棤璁哄灏戠嚎绋嬪涓€涓鍔ㄥ璞¤皟鐢紝淇濊瘉鍚屾椂鍙湁涓€涓湪瀹為檯鎵ц銆傚洜涓烘洿灏戠殑涓婁笅鏂囧垏鎹㈠拰鏁版嵁浼犻€掞紝杩欎釜妯″紡姣斾富鍔ㄥ璞℃晥鐜囧憡銆備絾姝ゆā寮忚緝闅炬妸瀹㈡埛鍜屾湇鍔$嚎绋嬪垎甯冨湪涓嶅悓鏈哄櫒涓娿€?
    鍙嶅簲鍫嗭紙Reactor锛夋ā寮忥紝褰撲笉浼氬啀鍙戠敓闃诲鐨勬椂鍊欙紝瑙﹀彂澶氫釜浜嬩欢澶勭悊鍣紝鍒嗚В鍜岃Е鍙戜换鍔°€傚湪瀛樺湪鍥炶皟鏈哄埗鐨勮鍔ㄥ璞℃椂锛屽父鐢ㄨ繖涓ā寮忎唬鏇夸富鍔ㄥ璞°€備篃甯稿父鐢ㄥ畠鏉ヨ繛鎺ヤ富鍔ㄥ璞″拰涓嬮潰鐨勫崐鍚屾鍗婂紓姝ユā寮忎竴璧蜂娇鐢ㄣ€?
    鍗婂悓姝ュ崐寮傛锛圚alf-Sync/Half-Async锛夋ā寮忥紝杩欎釜鎽哥储鐢ㄦ潵鍒嗙鍚屾鍜屽紓姝ヨ皟鐢ㄣ€傝繖涓ā寮忓父甯镐娇鐢ㄦ椿鍔ㄥ璞℃潵瀹炵幇寮傛浠诲姟灞傘€?
    鍛戒护澶勭悊鍣紙Command Processor锛夋ā寮忥紝杩欎釜妯″紡鍜屼富鍔ㄥ璞″樊涓嶅銆傚畠鐢ㄦ潵鍒嗙璇锋眰鐨勫彂鍑哄拰鎵ц锛屼竴涓懡浠ゅ鐞嗗櫒灏辩浉褰撲簬涓€涓皟搴﹁€呫€傜劧鑰岋紝浠栨病鏈変唬鐞嗚€咃紝瀹㈡埛鐩存帴鍙戝竷鍛戒护銆?
    Broker妯″紡锛岃繖涓篃鍜屼富鍔ㄥ璞$被浼笺€備富瑕佺殑涓嶅悓鏄紝浠g悊鑰呭拰鎵ц鑰呮槸鍒嗗竷杈圭晫鑰屼笉鏄嚎绋嬭竟鐣屻€?
    浜掓枼浣擄紙Mutex锛夋ā寮忋€傛湁鏃朵唬鏇夸富鍔ㄥ璞℃ā寮忥紝绠€鍗曠殑鍦ㄤ竴涓富鍔ㄥ璞′笂鍔犱竴涓攣锛屼娇鍏跺彲浠ュ苟鍙戠殑琚皟鐢ㄣ€備粬鏈夊绉嶅疄鐜版柟寮忥紝濡傞噸鍙犵殑閿侊紝鏀寔鏉冮檺缁ф壙鐨勯攣銆?