锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏈紼嬭姹傚惉璇句漢鍛樺凡緇忚榪囥奤nix 緗戠粶緙栫▼銆嬶紝鑳藉啓綆鍗曠殑 TCP echo 鏈嶅姟銆?/p> 璇劇▼鍦板潃錛?a title="http://boolan.com/course/4" >http://boolan.com/course/4 閰嶅欏甸潰錛?a >http://chenshuo.com/pnp 璐拱鍦板潃錛?a >http://e.jd.com/30149978.html 闃呰鏁堟灉錛?/p>
鐩墠浜笢鐨勯槄璇誨櫒娌℃湁鍒囩櫧杈瑰姛鑳斤紝鍊煎緱鏀硅繘銆?/p>
]]>PC
iPad
鍏堣璇寸▼搴忓憳錛堝簲灞婄敓錛夐潰璇曠殑涓鑸繃紼嬶紝涓杞潰璇曪紙闈㈠涓鍒頒袱涓潰璇曞畼錛変竴鑸槸鍥涖佷簲鍗佸垎閽燂紝闈㈣瘯瀹樹細闂袱涓変釜緙栫▼闂錛堥氬父鏄袱澶т竴灝忥級錛屽洜姝ょ暀緇欐瘡涓紪紼嬮鐨勬椂闂村彧鏈?20 鍒嗛挓銆傝繖 20 鍒嗛挓涓嶅厜鏄啓浠g爜錛岃繕瑕佽窡闈㈣瘯瀹樿璁轟綘鐨勭瓟妗堝茍瑙g瓟鎻愰棶錛屾瘮濡傞潰璇曞畼鎷胯繃浣犵殑絳旀綰革紝闂煇涓琛屼唬鐮佸鏋滀慨鏀逛細鏈変粈涔堝悗鏋溿傚洜姝ょ湡姝g暀緇欏湪綰鎬笂鎴栫櫧鏉夸笂鍐欎唬鐮佺殑鏃墮棿涔熷氨 10 鍒嗛挓涓婁笅銆傛湰鏂囩粰鍑轟簡涓涓兘鐢?10 鍒嗛挓鏃墮棿鍦ㄧ焊涓婂啓鍑烘潵涓斾笉浼氭湁閿欑殑 String class錛屽己璋冩紜у強鏄撳疄鐜幫紙鐧芥澘涓婂啓涔熶笉浼氶敊錛夛紝涓嶅己璋冩晥鐜囦笌鍔熻兘瀹屽銆?/p>
鏈枃鐨勯厤濂椾唬鐮佷綅浜?https://github.com/chenshuo/recipes/blob/master/string/StringTrivial.h銆?/p>
鍏ㄦ枃錛?a title="https://chenshuo.googlecode.com/files/CppEngineering.pdf" >https://chenshuo.googlecode.com/files/CppEngineering.pdf
> 闄堢錛屼綘濂斤紝
>
> 闃呰浜嗕綘鐨勪功錛屽緢鏈夋敹鑾楓?br>> 浣嗘槸娌℃湁鍦╩oduo鐨勬簮浠g爜閲岄潰鎵懼埌瀹炵幇綰跨▼妯″瀷11鐨勪緥瀛愩傚嵆one thread per loop + thread pool銆?br>> 璋㈣阿銆?/p>
涔︾ 173 欏靛浘 6-14 涓嬮潰鐨勭涓孌佃瘽錛屽叿浣撴敼鍔ㄦ柟娉曞弬鑰冨墠涓欏電殑 diff銆?/font>
> 璋㈣阿銆?br>>
> 鍙﹀TcpConnection鍜孋hannel鐨勭敓鍛藉懆鏈熺鐞嗘湁鐐歸棶棰樸?br>> TcpConnection濡傛灉宸茬粡琚洖鏀朵簡錛屽叾鍖呭惈鐨凜hannel涔熷凡緇忚鍥炴敹浜嗐傝岃繖涓椂鍊欏湪Channel::handleEvent()閲岄潰媯鏌ied_鍜宼ie_鏄嵄闄╃殑銆傚洜涓哄叾鍐呭瓨宸茬粡琚洖鏀朵簡銆?br>>
> 濡傛灉鐢ㄦ埛淇濊瘉TcpConnection琚洖鏀朵箣鍚庯紝涓嶄細鍐嶇敤Channel鐨勮8鎸囬拡錛屽垯娌℃湁蹇呰鍦═cpConnection::connectEstablished()涓璫all tie().
TcpConnection 鍥炴敹涔嬪墠錛屼細璋冪敤 connectDestroyed錛屽叾涓皟鐢?channel_->remove();錛岃繖鏍峰氨涓嶅彲鑳藉啀浼氭湁 Channel::handleEvent() 琚皟鐢ㄤ簡銆?/font>
tie() 鐨勪綔鐢ㄦ槸闃叉 Channel::handleEvent() 榪愯鏈熼棿鍏?owner 瀵硅薄鏋愭瀯錛屽鑷?Channel 鏈韓琚攢姣併?/font>
> > TcpConnection 鍥炴敹涔嬪墠錛屼細璋冪敤 connectDestroyed錛屽叾涓皟鐢?channel_->remove();錛岃繖鏍峰氨涓嶅彲鑳藉啀浼氭湁 Channel::handleEvent() 琚皟鐢ㄤ簡銆?br>> 榪欎釜鏃跺欎細涓嶄細鏈塺ace condition錛熷亣璁劇幇鍦ㄦ湁涓や釜active channels錛屽鐞嗗ご涓涓殑鏃跺欏洖鏀禩cpConnection錛岃岀浜屼釜channel鍒氬ソ瀵瑰簲榪欎釜connection銆?/p>
榪欐椂浣犳病鏈夊姙娉曞己鍒墮攢姣?TcpConnection錛屽彧鑳介檷浣庡叾寮曠敤璁℃暟錛屾墍浠ヤ笉浼氭湁闂銆備綘鍙互鍐欐浠g爜璇曡瘯銆?/font>
> 鍙﹀搴曞眰鐨刾oller OS api鏄惁淇濊瘉unregister channel涔嬪悗涓瀹氫笉浼氬啀鏈夎繖涓猚hannel鐨勪簨浠訛紝浼氭竻絀哄唴鏍哥殑宸茬粡灝辯華鐨勪簨浠墮槦鍒楋紵
璺熷唴鏍告病鍏崇郴錛孭oller class 鍦?unregister channel 涔嬪悗灝變笉鍙兘璋冪敤鍏?handleEvent() 鎴愬憳鍑芥暟銆?/font>
> 閭PollPoller::fillActiveChannels()鐨勬敼涓鏀癸紝鈥渁ssert(it != channels_.end());鈥濅笉鍐嶉傜敤浜嗭紝鑰屼笖姣忔閮戒釜event閮借鏌ヤ竴嬈ap銆傛晥鐜囦細鏈夐棶棰樸?/p>
assert() 鍙湁鍦?debug build 鎵嶆墽琛岋紝涓嶄細褰卞搷鏁堢巼銆?br>鍐嶈姣忎釜 event 閮借娑夊強 read/write 絳夌郴緇熻皟鐢紝寮閿姣斺滄煡涓嬈?map鈥濆ぇ寰楀錛屼紭鍖栬繖閲屾槸鏃犵敤鍔熴?/strong>
> 浣嗚繖涓猘ssert()涓嶆槸invalid浜嗗悧錛熶綘鍙兘涔嬪墠鍦╱nregister channel鐨勬椂鍊欏凡緇忎粠map閲岄潰remove鎺変簡瀹冦?
榪欎釜 assert 鏄湁鏁堢殑錛屼綘鍐嶆兂鎯熾?/font>
> > tie() 鐨勪綔鐢ㄦ槸闃叉 Channel::handleEvent() 榪愯鏈熼棿鍏?owner 瀵硅薄鏋愭瀯錛屽鑷?Channel 鏈韓琚攢姣併?/font>
> 榪欎釜涔熶笉澶猰ake sense銆備粛鐒舵湁race conditon銆傚湪Channel::handleEvent()鎷ユ湁guard閿佸畾ownner涔嬪墠錛孋hannel::handleEvent錛?闇瑕佹鏌ュ叾tied_銆?/p>
浣犲啀鎯蟲兂錛宼ie 鐨勪綔鐢ㄦ槸闃叉璋冪敤 handleEvent() 鏈熼棿瀵硅薄閿姣侊紙姣斿璋冪敤 closeCallback 鏈熼棿錛夛紝涓嶆槸涔熶笉鍙兘闃叉璋冪敤 handleEvent() 涔嬪墠瀵硅薄閿姣併?/strong>
> 鎭╋紝鏄殑銆傛暣涓猅cpConnection, Channel, EventLoop閮芥槸涓涓猼hread閲岄潰run鐨勩?/font>
璧栧媷嫻╋紙http://laiyonghao.com錛?/p>
鏈榪戯紝鏈変竴浣嶆湅鍙嬪洜涓哄伐浣滈渶瑕侊紝闇瑕佷粠緗戞父鐨勫鎴風緙栫▼杞悜鏈嶅姟鍣ㄧ緙栫▼錛屾壘鎴戞帹鑽愪竴鏈功銆傛垜鎺ㄨ崘浜嗐奓inux 澶氱嚎紼嬫湇鍔″櫒绔紪紼?#8212;—浣跨敤 muduo C++ 緗戠粶搴撱嬬粰浠栵紝浠栧湪緗戜笂涔﹀簵鐪嬩簡浠ュ悗闂垜涓轟粈涔堟帹鑽愯繖涔堝帤涓鏈功緇欎粬錛屾濂借繖鏈功鎴戝凡緇忔棭灝辯湅瀹屼簡錛屼竴鐩翠篃鎯沖啓綃?#8220;涔﹁瘎”錛屽氨鍦ㄨ繖閲屽鎵嚑鍙ャ傚叾瀹炲疄鍦ㄧ畻涓嶄笂涔﹁瘎錛屽師鍥犳湁浜岋細涓鏄涔︾殑鏃跺欏洬鍥靛悶鏋o紝鐞嗚В涓嶅娣卞埢錛屼笉娣卞埢鑷劧涓嶈兘璇勶紱浜屾槸榪欏嚑騫磋櫧鐒跺湪 Linux 涓嬪啓鏈嶅姟鍣ㄧ鐨勭綉緇滅▼搴忥紝浣嗗緢灝戠敤澶氱嚎紼嬶紝涔熷緢灝戠敤 C++錛屼功閲岃皥鐨勪笢瑗匡紝綆楁槸涓嶇啛鎮夌殑棰嗗煙錛岃嚜鐒朵篃涓嶈兘涔辮瘎銆傛墍浠ヤ粖澶╄繖綃囷紝搴斿綋鏄帹鑽愶紝鏄負闄堢鑰佸笀鑳屼功銆?/p>
緇х畫闃呰錛?/p>
http://blog.csdn.net/gzlaiyonghao/article/details/10366863
http://book.douban.com/review/6249351/
鍓嶅嚑澶╋紝鎴戝彂浜嗕竴鏉″井鍗?http://weibo.com/1701018393/A7FrW7ZVd 錛岃川鐤戞煇鏈功瀵?Pthreads 鏉′歡鍙橀噺鐨勫皝瑁呮槸閿欑殑錛屽洜涓哄畠娌℃湁鎶?mutex 鐨?lock()/unlock() 鍑芥暟鏆撮湶鍑烘潵錛屽鑷存棤娉曞疄鐢ㄣ傚悗鏉ュぇ瀹惰璁虹殑鍒嗘鏄繖涓?cond class 鏄笉鏄氱敤鐨勬潯浠跺彉閲忓皝瑁咃紝榪樻槸鍙槸涓涓壒孌婄殑“浜嬩歡絳夊緟鍣?#8221;銆備綔涓轟簨浠剁瓑寰呭櫒錛屽叾瀹炵幇涔熸槸閿欑殑錛屽洜涓哄瓨鍦ㄤ涪澶變簨浠剁殑鍙兘錛屽彲浠ョ畻鏄垵瀛﹁呬嬌鐢ㄦ潯浠跺彉閲忕殑鍏稿瀷閿欒銆?/p>
鏈枃鐨勪唬鐮佷綅浜?recipes/thread/test/Waiter_test.cc錛岃繖閲屾彁鍒扮殑鏌愪功鐨勭増鏈浉褰撲簬 Waiter1 class銆?/p>
鎴戝湪鎷欎綔銆奓inux 澶氱嚎紼嬫湇鍔$緙栫▼錛氫嬌鐢?muduo C++ 緗戠粶搴撱嬬 2.2 鑺傛葷粨浜嗘潯浠跺彉閲忕殑浣跨敤瑕佺偣錛?/p>
鏉′歡鍙橀噺鍙湁涓縐嶆紜嬌鐢ㄧ殑鏂瑰紡錛屽嚑涔庝笉鍙兘鐢ㄩ敊銆傚浜?wait 绔細
1. 蹇呴』涓?mutex 涓璧蜂嬌鐢紝璇ュ竷灝旇〃杈懼紡鐨勮鍐欓渶鍙楁 mutex 淇濇姢銆?br />2. 鍦?mutex 宸蹭笂閿佺殑鏃跺欐墠鑳借皟鐢?wait()銆?br />3. 鎶婂垽鏂竷灝旀潯浠跺拰 wait() 鏀懼埌 while 寰幆涓?/font>
瀵逛簬 signal/broadcast 绔細
1. 涓嶄竴瀹氳鍦?mutex 宸蹭笂閿佺殑鎯呭喌涓嬭皟鐢?signal 錛堢悊璁轟笂錛夈?br />2. 鍦?signal 涔嬪墠涓鑸淇敼甯冨皵琛ㄨ揪寮忋?br />3. 淇敼甯冨皵琛ㄨ揪寮忛氬父瑕佺敤 mutex 淇濇姢錛堣嚦灝戠敤浣?full memory barrier錛夈?br />4. 娉ㄦ剰鍖哄垎 signal 涓?broadcast錛?#8220;broadcast 閫氬父鐢ㄤ簬琛ㄦ槑鐘舵佸彉鍖栵紝signal 閫氬父鐢ㄤ簬琛ㄧず璧勬簮鍙敤銆傦紙broadcast should generally be used to indicate state change rather than resource availability銆傦級”
濡傛灉鐢ㄦ潯浠跺彉閲忔潵瀹炵幇涓涓?#8220;浜嬩歡絳夊緟鍣?Waiter”錛屾紜殑鍋氭硶鏄庢牱鐨勶紵鎴戠殑鏈緇堢瓟妗堣 WaiterInMuduo class銆?#8220;浜嬩歡絳夊緟鍣?#8221;鐨勪竴縐嶇敤閫旀槸紼嬪簭鍚姩鏃剁瓑寰呭垵濮嬪寲瀹屾垚錛屼篃鍙互鐩存帴鐢?muduo::CountDownLatch 鍒拌揪鐩稿悓鐨勭洰鐨勶紝灝嗗垵鍊艱涓?1 鍗沖彲銆?/p>
浠ヤ笅鏍規嵁寰崥涓婄殑璁ㄨ榪囩▼緇欏嚭鍑犱釜姝g‘鎴栭敊璇殑鐗堟湰錛屽崥澶у涓絎戙?font color="#0000ff">鍙璁頒綇 Pthread 鐨勬潯浠跺彉閲忔槸杈規部瑙﹀彂錛坋dge trigger錛夛紝鍗?signal()/broadcast() 鍙細鍞ら啋宸茬粡絳夊湪 wait() 涓婄殑綰跨▼(s)錛?/font>鎴戜滑鍦ㄧ紪鐮佹椂蹇呴』瑕佽冭檻 signal() 鏃╀簬 wait() 鐨勫彲鑳斤紝閭d箞灝卞緢瀹規槗鍒ゆ柇浠ヤ笅鍚勪釜鐗堟湰鐨勬璇簡銆備唬鐮佽 recipes/thread/test/Waiter_test.cc銆?/p>
鐗堟湰涓錛?font color="#ff0000">閿欒銆傛煇涔︿笂鐨勫師濮嬬増錛屾湁涓㈠け浜嬩歡鐨勫彲鑳姐?/p>

鐗堟湰浜岋細閿欒銆俵ock() 涔嬪悗鍐?signal()錛屽悓鏍鋒湁涓㈠け浜嬩歡鐨勫彲鑳姐?/p>

鐗堟湰涓夛細閿欒銆傚紩鍏ヤ簡 bool signaled_; 鏉′歡錛屼絾娌℃湁姝g‘澶勭悊 spurious wakeup銆?/p>
鐗堟湰鍥涗簲鍏細姝g‘銆備粎闄?single waiter 浣跨敤銆?br />
鐗堟湰涓冿細鏈浣熾傚彲渚?multiple waiters 浣跨敤銆?br />
鐗堟湰鍏細閿欒銆傚瓨鍦?data race錛屼笖鏈変涪澶變簨浠剁殑鍙兘銆傜悊鐢辮 http://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex
鎬葷粨錛氫嬌鐢ㄦ潯浠跺彉閲忥紝璋冪敤 signal() 鐨勬椂鍊欐棤娉曠煡閬撴槸鍚﹀凡緇忔湁綰跨▼絳夊緟鍦?wait() 涓娿傚洜姝や竴鑸繪槸瑕佸厛淇敼“鏉′歡”錛屼嬌鍏朵負 true錛屽啀璋冪敤 signal()錛涜繖鏍?wait 綰跨▼鍏堟鏌?#8220;鏉′歡”錛屽彧鏈夊綋鏉′歡涓嶆垚绔嬫椂鎵嶅幓 wait()錛岄伩鍏嶄簡涓簨浠剁殑鍙兘銆?span style="color: #333333; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff;">鎹㈣█涔嬶紝閫氳繃浣跨敤“鏉′歡”錛屽皢杈規部瑙﹀彂錛坋dge trigger錛夋敼涓虹數騫寵Е鍙戯紙level trigger錛夈?/span>榪欓噷“淇敼鏉′歡”鍜?#8220;媯鏌ユ潯浠?#8221;閮藉繀欏誨湪 mutex 淇濇姢涓嬭繘琛岋紝鑰屼笖榪欎釜 mutex 蹇呴』鐢ㄤ簬閰嶅悎 wait()銆?/p>
鎬濊冮錛氬鏋滅敤涓や釜 mutex錛屼竴涓敤浜庝繚鎶?#8220;鏉′歡”錛屽彟涓涓笓闂ㄧ敤浜庡拰 cond 閰嶅悎 wait()錛屼細鍑虹幇浠涔堟儏鍐碉紵
鏈鍚庢敞鏄庝竴鐐癸紝http://stackoverflow.com/questions/6419117/signal-and-unlock-order 榪欑瘒甯栧瓙閲屽 spurious wakeup 鐨勮В閲婃槸閿欑殑錛宻purious wakeup 鎸囩殑鏄竴嬈?signal() 璋冪敤鍞ら啋涓や釜鎴栦互涓?wait()ing 鐨勭嚎紼嬶紝鎴栬呮病鏈夎皟鐢?signal() 鍗存湁綰跨▼浠?wait() 榪斿洖銆俶anpage 閲屽 Pthreads 緋誨垪鍑芥暟鐨勪粙緇嶉潪甯稿埌浣嶏紝鍊煎緱緇嗚銆?/p>
榪欎笉鏄?memcached 鐨勬浛浠e搧錛堝畠娌℃湁瀹炵幇LRU鍜岃秴鏃跺姛鑳斤紝涔熸病鏈夊疄鐜頒簩榪涘埗鍗忚錛屾洿娌℃湁鑷繁綆$悊鍐呭瓨錛夛紝鑰屾槸涓涓綉緇滅紪紼嬬殑紺轟緥錛堜唬鐮佸彧鏈?1000 琛岋紝姣?memcached 灝忓緢澶氾級錛屽睍紺?muduo 椋庢牸鐨勪簨浠墮┍鍔ㄧ紪紼嬶紝浠ュ強灝嗘潵鎬ц兘浼樺寲鐨勮瘯楠屽搧錛堟崲鍙ヨ瘽璇達紝鐜板湪榪欎釜鐗堟湰瀹屽叏娌℃湁鍦ㄦц兘涓婂仛鍑轟換浣曞姫鍔涳級銆傝榪?memcached 浠g爜鐨勪漢鍙互瀵規瘮榪欎袱縐嶇紪紼嬮鏍肩殑鍖哄埆錛宮emcached 鐨?read/write 鎿嶄綔絀挎彃浜庢甯擱昏緫澶勭悊錛岃?muduo 鐨勭綉緇滄暟鎹鍐欐槸鐢卞簱瀹屾垚錛屽簲鐢ㄧ▼搴忓彧鍏沖績娑堟伅鏀跺彂錛岀洰鍓嶄簩鑰呯殑鍩烘湰 get/set 鎿嶄綔鐨勬ц兘鐩稿綋銆?/p>
鐜板湪 muduo 鐨?inspector 鍐呯疆浜?gperftools 鐨勮繙紼?profiling 鍔熻兘錛宮emcached-debug 灞曠ず浜嗗叾鐢ㄦ硶銆?/p>
涓轟粈涔堜笉蹇呬紭鍖?set 鎿嶄綔錛堝惈 set/add/update/append/prepend/cas 絳夛級鐨勬ц兘錛?/p>
1. 姣斾緥銆傛棦鐒舵槸 memcache錛岄偅涔?get:set 鐨勬瘮渚嬪緢楂橈紝10:1 鐢氳嚦鏇撮珮錛屽洜姝や紭鍖栫殑閲嶅績搴旇鏄?get 鑰岄潪 set銆?/p>
鍋囪 memcached 鑳藉鐞?100k QPS錛屽啀鍋囪榪欎簺鎿嶄綔閮芥槸 set錛堝叾瀹炲簲璇ヤ笉鍒?10% 鏄?set錛夛紝鍐嶅亣璁炬墍鏈夌殑 set 閮芥槸涓茶鎵ц鐨勶紙娌℃湁騫跺彂錛夛紝閭d箞姣忔 set 鐨?CPU 鏃墮棿涓嶅簲璇ヨ秴榪?10 us錛堝惈鏈嶅姟鍣ㄦ湰鍦扮殑緗戠粶浠g爜榪愯鏃墮棿錛屼絾涓嶅惈緗戠粶寤惰繜錛夈傝屽疄闄呬笂涓嬈?set 鐨?CPU 鏃墮棿鏈澶氭槸 2~3 us 錛堢敤 memcached-footprint 紼嬪簭嫻嬪緱錛夛紝鏍規湰涓嶅煎緱浼樺寲銆?/p>
2. 緗戠粶甯﹀銆傚亣璁句竴嬈?set 鎿嶄綔鐨?key + value 鐨勯暱搴︽槸 1k bytes錛孴CP 鐨勬湁鏁堣澆鑽峰甫瀹芥寜110MB/s浼扮畻錛岄偅涔?kB鏁版嵁鍦ㄥ崈鍏嗙綉涓婄殑鎯у歡榪熸槸 9us錛堜紶杈撳歡榪熸槸鍑犲崄涓婄櫨寰錛屼笌姝ゆ棤鍏籌級錛屼篃灝辨槸璇存湇鍔″櫒鐨勭綉鍗℃敹鍒拌繖 1kB 鏁版嵁闇瑕佽姳 9us 鏃墮棿錛堜粠絎竴涓瓧鑺傚埌杈懼埌鏈嶅姟鍣ㄥ埌鏀跺畬鏈鍚庝竴涓瓧鑺傦級錛岄偅涔堝湪 set 鑰楁椂 2~3 us 鐨勬儏鍐典笅鍐嶅幓浼樺寲瀹冩槸鍋氭棤鐢ㄥ姛銆?/p>
3. 浜х敓“闇瑕佹洿鏂扮殑鏁版嵁”鐨勬垚鏈繙澶т簬 memcached set 鐨勫紑閿銆俶emcached 闇瑕佹洿鏂幫紝寰寰鏄皢宸插啓鍏ユ暟鎹簱鐨勬柊鏁版嵁鏀懼埌 memcached 涓紝閭d箞鍐欐暟鎹簱鐨勫紑閿榪滆繙澶т簬 memcached set 鐨勫紑閿錛屼紭鍖?set 瀵規彁鍗囩郴緇熸暣浣撴ц兘娌℃剰涔夈?/p>
鐭ラ亾紱佺敤 copy-ctor/assign operator 鏄?C++ 紼嬪簭鍛樼殑璇曢噾鐭熾傚湪鐪嬪埌涓涓紑婧愰」鐩椂錛屾垜涓鑸細鍏堟煡鐪嬪叾 RAII handle class 鏄惁紱佺敤浜?copy-ctor/assign operator錛堜緥濡?Thread銆丮utex銆丆ondVar銆丆onnection錛夛紝濡傛灉娌℃湁錛屽鍏剁涓鍗拌薄灝卞緢宸簡銆?/p>
鍏充簬 class 鍛藉悕椋庢牸錛孏oogle銆丩LVM銆丮ozilla銆乵uduo 閮介噰鐢?Pascal 椋庢牸錛圠ikeThis錛夛紝渚嬪 EventLoop銆丼udokuSolver 絳夌瓑銆傛宸у畠浠篃閮芥槸鐢?2 鏍肩緝榪涚殑錛屽彲浠ョ敤 clang-format 鑷姩鏍煎紡鍖栦唬鐮併?/p>
欏轟究璇磋鎴戜笉璁ゅ悓鐨勪袱涓?C++ 鏁欐潯錛?. 鐢╪ullptr鏇挎崲NULL錛?. 鐢╟stdio澶存枃浠舵浛鎹tdio.h銆?/font>
鍥犱負渚嬪 gettimeofday(&tv, NULL) 榪欑緋葷粺鍑芥暟浼犱釜 nullptr 榪涘幓瀹炲湪鏄繚鍜岋紝鐜板湪鐢?NULL 涔熻兘杈懼埌 nullptr 鐨勫ソ澶勶紝澶т笉浜嗗湪鏌愪釜澶存枃浠墮噷define涓涓嬪氨琛屻傝繖鏉″皢鏉ユ垨璁鎬細鍙樸?/p>
鍙﹀ ctime 澶存枃浠舵病瀹氫箟 std::gmtime_r錛岃?time.h 瀹氫箟浜?::gmtime_r銆傛垜鍙笉鎯沖幓鑳屽摢浜涘嚱鏁版槸 C 璇█鐨勫摢浜涙槸 Posix 鐨勶紝鍝簺澶存枃浠舵槸 C 璇█鐨勫摢浜涙槸 Posix 鐨勶紙鍦↙inux涓嬶紝浜岃呭熀鏈笉鍒嗗錛夈備負浜嗙敤鍑犱釜緋葷粺鍑芥暟錛堜緥濡?fcntl() 錛夛紝鎴戣 include cfcntl 榪樻槸 fcntl.h錛熺敤綰跨▼鏄?cpthread 榪樻槸 pthread.h錛熸垜鎬繪槸璁頒笉浣?memset() 鐨勫弬鏁伴『搴忥紝鍥犳涓鑸敤 bzero() 浠f浛錛屼絾鏄?manpage 璇?bzero() 澹版槑浜?strings.h錛岄偅鎴戣涓嶈鑰冭檻璇曡瘯 cstrings 鍛紵浣曞繀緇欒嚜宸辨壘楹葷儲錛孋++ 鏍囧噯搴撲箣澶栫殑鍐呭騫茶剢緇熶竴鐢?.h 澶存枃浠跺ソ浜嗐?/p>
鎬ц兘浼樺寲錛?/font>
鏈変簺浜哄父甯告妸“鎬ц兘”鎸傚湪鍢磋竟錛岃屼笖鍏朵互“鎻愰珮鎬ц兘”涓虹悊鐢辯殑“浼樺寲鎺柦”寰寰涓嶅埌鐐瑰瓙涓婏紝鍙鍔犱簡澶嶆潅鎬у拰緇存姢闅懼害錛岄檷浣庝簡浠g爜璐ㄩ噺銆傝繖灞炰簬鍐崇瓥鐐規壘鍋忎簡銆傛垜鍙戠幇鍒濆鑰呭線寰榪囧垎鍏蟲敞寰錛堣鍙ョ駭錛夋ц兘錛屾瘮鏂硅鍏沖績 while(true) 鍜?for(;;) 鍝釜鏇村揩錛?+i 涓?i=i+1 鍝釜鏇村揩錛宨/=16 鍜?i >>= 4 鍝釜蹇瓑絳夛紝鑰屽拷瑙嗕簡鐜頒唬緙栬瘧鍣ㄧ殑浼樺寲鑳藉姏銆?/p>
鏈夌殑浜鴻皥鎬ц兘浼樺寲錛屼竴鏄嬁涓嶅嚭鍏蜂綋鐨勫悎鐞嗙殑鎬ц兘鐩爣錛屽彧鎯寵秺蹇秺濂斤紝浜屾槸涓嶈兘瀹為檯鍑嗙‘嫻嬮噺楠岃瘉鎬ц兘鏁版嵁錛屽嚟鎰熻鍜岃繃鏃剁粡楠岃浜嬨傚湪緙栫爜鐨勬椂鍊欙紝閬囧埌涓ょ鍋氭硶閮藉彲琛岋紝鍐崇瓥鍔炴硶鏄嚟鎰熻鐚滈?#8220;鎬ц兘浼氭洿濂?#8221;鐨勪竴縐嶏紝鑰屽拷瑙嗕簡鍏朵粬鏇撮噸瑕佺殑鍥犵礌銆傚彲璇繪у拰鎬ц兘鐨勫吀鍨嬪叧緋誨涓嬪浘錛屾湁澶氬皯鍦哄悎鏄煎緱涓轟簡鎬ц兘鑰岀壓鐗蹭唬鐮佺殑鍙鎬у拰鍙淮鎶ゆу憿錛熸垜甯屾湜鑷繁鐨勪唬鐮佷綅浜庣 3 鍖猴紝鑰屼竴浜涗漢浠ヤ負鑷繁鐨勪唬鐮佹槸鍦ㄧ 4 鍖猴紝鍏跺疄鏄湪絎?1 鍖恒?/p>

鑳藉湪絎?4 鍖哄啓浠g爜鐨勪漢灞炰簬鍑ゆ瘺楹熻錛屾湁鏃跺欎綘璐瑰姴浼樺寲浜嗗崐澶╋紝緇撴灉鏂癈PU鍔犱簡鍑犳潯鎸囦護錛岀洿鎺ュ湪紜歡灞傞潰鎶婇棶棰樿В鍐充簡銆傜幇鍦ㄤ竴浜涗漢鍔ㄤ笉鍔ㄥ氨瑕佹尳璧瘋瀛愯嚜宸卞啓鍐呭瓨姹狅紝鍙風О鑳芥彁楂樻ц兘錛岀湡褰?Ulrich Drepper 鏄按璐э紵錛堜功絎?12.2.8 鑺?#8220;鏈夊繀瑕佽嚜琛屽畾鍒跺唴瀛樺垎閰嶅櫒鍚?#8221;錛変綘鎵撶畻濡備綍嫻嬭瘯鍐呭瓨鍒嗛厤鍣紙malloc錛夌殑鎬ц兘錛熸湁鍝簺鎸囨爣錛熸湁鍝簺褰卞搷鍥犵礌闇瑕佹帶鍒舵垨妯℃嫙錛堟瘮濡傜嚎紼嬫暟錛夛紵浣犵殑嫻嬭瘯緇撴灉鏄惁鍙嶆槧瀹為檯鍦烘櫙錛?/p>
鏉傞」
鏈変漢闂負浠涔堟垜璇?#8220;poco涓嶆槸鏈嶅姟绔疌++緗戠粶搴?#8221;錛?http://www.oschina.net/question/12_120943 錛夛紝铏界劧瀹冧篃鎻愪緵浜唕eactor錛熷洜涓哄畠鐨剅eactor鐢ㄧ殑鏄?Socket::select()錛岃櫧鐒跺悗鑰呭寘瑁呬簡epoll錛屼絾鐪嬪叾瀹炵幇灝辯煡閬擄紝瀹冩瘡嬈¤皟鐢ㄩ兘浼氬垱寤哄茍閿姣?epoll fd錛岀劧鍚庨噸寤烘暣涓獁atch list錛屾病鏈夊摢涓湇鍔$緗戠粶搴撲細榪欎箞鍋氥?br />
浠ヤ笅璋堜竴璋堣繖鏈功鐨勫啓浣滆儗鏅笌鍐呭鍙栬垗鐨勫師鍥犮?
鍙傚姞宸ヤ綔浠ユ潵錛屾垜緙栧啓騫剁淮鎶や簡鑻ュ共C++/Java澶氱嚎紼嬬綉緇滄湇鍔$▼搴忥紝榪欐湰涔︽葷粨浜嗘垜鍦ㄥ紑鍙戠淮鎶よ繖綾繪湇鍔$▼搴忔柟闈㈢殑緇忛獙銆傚伐浣滀腑錛屾垜娌℃湁鍐欒繃鍗曠嚎紼嬬殑緗戠粶鏈嶅姟紼嬪簭錛屾病鏈夊啓榪嘋璇█鐨勭綉緇滄湇鍔$▼搴忥紝涔熸病鏈夊啓榪囪繍琛屽湪Windows涓嬬殑緗戠粶鏈嶅姟紼嬪簭錛屽洜姝ゆ湰涔︿笉娑夊強榪欎簺鍐呭銆?
鍦?#8220;Linux鏈嶅姟绔紑鍙?#8221;榪欎竴鑳屾櫙涓嬶紝榪欐湰涔︿富瑕佽涓変釜鏂歸潰鐨勫唴瀹?a href="#_ftn1_3988" name="_ftnref1_3988">[1]錛氱幇浠++銆佸綰跨▼銆佺綉緇滅紪紼嬶紝鍒嗗埆瀵瑰簲涔︾殑絎?銆?銆?閮ㄥ垎銆傝繖涓嶆槸涓鏈叆闂ㄤ功錛屾湰涔︾殑璇昏呭簲璇ュ湪浠ヤ笂涓夋柟闈㈠凡緇忓叿澶囩浉褰撶殑鍩虹[2]錛氱綉緇滅紪紼嬫柟闈紝鑳借交鏉捐鎳?.1鑺傜殑涓や釜Python紼嬪簭錛汣++鏂歸潰錛屽12.8鑺傜殑浠g爜涓嶆劅鍒伴檶鐢燂紱澶氱嚎紼嬫柟闈紝鑳芥槑鐧界1绔犺瑙e喅浠涔堥棶棰樸?
絎?绔?#8220;鍒嗗竷寮忕郴緇熷伐紼嬪疄璺?#8221;璇︾粏浠嬬粛浜嗚繖鏈功鐨勫簲鐢ㄨ儗鏅紝鍗沖紑鍙戝叕鍙稿唴閮ㄧ殑鍒嗗竷寮忔湇鍔$郴緇燂紝涔︿腑鐨勫緢澶氬喅絳栵紙design decision錛夊拰鎶鏈彇鑸嶏紙trade-off錛夋槸鍦ㄨ繖涓搴旂敤鍦烘櫙涓嬪仛鍑虹殑銆備互涓嬫槸鍚勭珷鐩存帴鐨勪氦鍙夊紩鐢ㄥ叧緋誨浘錛堟病鏈夎綆楀紩鐢ㄦ鏁幫級錛屽叾涓0绔犳槸鍓嶈█錛屽瓧姣嶇珷鑺傛槸闄勫綍銆傚彲瑙佺9绔犳槸琚紩鐢ㄦ渶澶氱殑涓绔狅紝鏌愮鎰忎箟涓婂彲浠ヨ絎?绔犳棦鏄湰涔︾殑鍏堝喅鏉′歡錛屽張鏄湰涔︾殑緇堟瀬鐩爣銆傜敱浜庣珷鑺備箣闂村瓨鍦ㄤ紬澶氱殑浜ゅ弶寮曠敤錛屽幓鎺変換浣曚竴绔犻兘浼氱牬鍧忓唴瀹圭殑瀹屾暣鎬с?
榪欐湰涔︾殑涔﹀悕鍘熸湰鎵撶畻鍙?#8220;Linux C++ 澶氱嚎紼嬬郴緇熺紪紼?#8221;銆傚啓瀹屼箣鍚庡彂鐜幫紝涓庡叾浠朥nix/Linux緋葷粺緙栫▼鏂歸潰鐨勪功涓嶅悓錛岃繖鏈功鏈夋槑紜殑搴旂敤鍦烘櫙錛屽洜姝ゅ彲浠ョ爫鎺夊緢澶氬唴瀹癸紝紿佸嚭閲嶇偣銆傜敋鑷沖彲浠ヨ鎴戜富瑕佽鍒殑涔︽病鏈夎鍒扮殑鍐呭銆傝繖涓嶆槸涓鏈潰闈勘鍒扮殑涔︼紝鍥犳鏈緇堢殑涔﹀悕涔熷氨涓嶅彨“緋葷粺緙栫▼”浜嗐?
鍚屾椂錛屾垜璁や負寰堝鏁欑涔︿笂浠嬬粛鐨勪竴浜涘仛娉曟槸榪囨椂鐨勶紙signal錛夛紝涓浜涙槸涓嶆帹鑽愪嬌鐢ㄧ殑錛堜粠澶栭儴緇堟綰跨▼銆乀CP OOB鏁版嵁錛夛紝涓浜涙槸澶у鏁版儏鍐典笅娌″繀瑕佷嬌鐢ㄧ殑錛堝唴瀛樻睜銆乴ock-free 緙栫▼錛夈備綔涓哄叏闈㈢殑鏁欐潗鍜屾墜鍐岋紝鎶婅繖浜涘唴瀹規斁榪涘幓鍙互鐞嗚В銆備絾鏄繖鏈功瀹氫綅鏄粡楠屾葷粨錛屾垜鐣ュ幓浜嗘暀縐戜功涓婇偅浜涘熀鏈敤涓嶅埌鐨勭煡璇嗙偣錛屼互鍏嶅枾瀹懼ず涓伙紝涔熷緩璁鑰呬笉瑕佹妸綺懼姏鑺卞湪閭d簺嬈¤闂涓娿?
“淇℃伅”鎸夌収棣欏啘鐨勫畾涔夛紝鏄?#8220;鍑忓皯涓嶇‘瀹氭?#8221;錛岃繖鏈功鍖呭惈鐨勪俊鎭鏄噺灝戦夌敤緙栫▼璁炬柦錛坒acilities錛夋柟闈㈢殑涓嶇‘瀹氭э紝璁╄鑰呴泦涓簿鍔涙敾鍏嬫湰璐ㄩ棶棰樸傝繖鏈功浠嬬粛鐨勬柟娉曚笉涓瀹氬浜庢瘡涓簲鐢ㄥ満鏅兘鏄渶濂界殑錛屼絾鑲畾鏄畝渚挎槗琛岀殑錛屾槸鏃墮棿鎴愭湰銆佸姛鑳姐佹ц兘鐨勪竴縐嶅悎鐞嗘姌涓?
[1] 榪欐湰涔﹀墠璦鐨勭涓鍙ヨ瘽“鏈功涓昏璁茶堪閲囩敤鐜頒唬 C++ 鍦?x86-64 Linux 涓婄紪鍐欏綰跨▼ TCP 緗戠粶鏈嶅姟紼嬪簭鐨勪富嫻佸父瑙勬妧鏈?#8221;錛屽皝闈㈠嵃鐫“紺鴻寖鍦ㄥ鏍告椂浠i噰鐢ㄧ幇浠?C++ 緙栧啓澶氱嚎紼?TCP 緗戠粶鏈嶅姟鍣ㄧ殑姝h鍋氭硶”銆?
[2] 鍓嶈█鍐欏埌錛氳鑰呭簲璇ュ凡緇忓ぇ鑷磋榪囥婄幇浠f搷浣滅郴緇熴嬨併奤NIX 鐜楂樼駭緙栫▼銆嬨併奤NIX 緗戠粶緙栫▼銆嬨併奀++ Primer銆嬫垨涓庝箣鍐呭鐩歌繎鐨勪功綾嶏紝鐔熸倝鍩烘湰姒傚康錛屽茍鎺屾彙 Pthreads 鍜?Sockets API 鐨勫父瑙勭敤娉曘?
2012-01-28
鎴戝湪銆奓inux 澶氱嚎紼嬫湇鍔$緙栫▼錛氫嬌鐢?muduo C++ 緗戠粶搴撱嬬 1.9 鑺?#8220;鍐嶈 shared_ptr 鐨勭嚎紼嬪畨鍏?#8221;涓啓閬擄細
錛坰hared_ptr錛夌殑寮曠敤璁℃暟鏈韓鏄畨鍏ㄤ笖鏃犻攣鐨勶紝浣嗗璞$殑璇誨啓鍒欎笉鏄紝鍥犱負 shared_ptr 鏈変袱涓暟鎹垚鍛橈紝璇誨啓鎿嶄綔涓嶈兘鍘熷瓙鍖栥?/font>鏍規嵁鏂囨。錛?/font>http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety錛夛紝 shared_ptr 鐨勭嚎紼嬪畨鍏ㄧ駭鍒拰鍐呭緩綾誨瀷銆佹爣鍑嗗簱瀹瑰櫒銆乻td::string 涓鏍鳳紝鍗籌細
• 涓涓?shared_ptr 瀵硅薄瀹炰綋鍙澶氫釜綰跨▼鍚屾椂璇誨彇錛堟枃妗d緥1錛夛紱
• 涓や釜 shared_ptr 瀵硅薄瀹炰綋鍙互琚袱涓嚎紼嬪悓鏃跺啓鍏ワ紙渚?錛夛紝“鏋愭瀯”綆楀啓鎿嶄綔錛?/font>
• 濡傛灉瑕佷粠澶氫釜綰跨▼璇誨啓鍚屼竴涓?shared_ptr 瀵硅薄錛岄偅涔堥渶瑕佸姞閿侊紙渚?~5錛夈?/font>
璇鋒敞鎰忥紝浠ヤ笂鏄?shared_ptr 瀵硅薄鏈韓鐨勭嚎紼嬪畨鍏ㄧ駭鍒紝涓嶆槸瀹冪鐞嗙殑瀵硅薄鐨勭嚎紼嬪畨鍏ㄧ駭鍒?/font>
鍚庢枃錛坧.18錛夊垯浠嬬粛濡備綍楂樻晥鍦板姞閿佽В閿併傛湰鏂囧垯鍏蜂綋鍒嗘瀽涓涓嬩負浠涔?#8220;鍥犱負 shared_ptr 鏈変袱涓暟鎹垚鍛橈紝璇誨啓鎿嶄綔涓嶈兘鍘熷瓙鍖?/font>”浣垮緱澶氱嚎紼嬭鍐欏悓涓涓?shared_ptr 瀵硅薄闇瑕佸姞閿?/font>銆傝繖涓湪鎴戠湅鏉ユ樉鑰屾槗瑙佺殑緇撹浼間箮涔熸湁浜烘姳鏈夌枒闂紝閭e皢瀵艱嚧鐏鵑毦鎬х殑鍚庢灉銆傛湰鏂囦互 boost::shared_ptr 涓轟緥錛屼笌 std::shared_ptr 鍙兘鐣ユ湁鍖哄埆銆?/p> shared_ptr 鏄紩鐢ㄨ鏁板瀷錛坮eference counting錛夋櫤鑳芥寚閽堬紝鍑犱箮鎵鏈夌殑瀹炵幇閮介噰鐢ㄥ湪鍫嗭紙heap錛変笂鏀句釜璁℃暟鍊鹼紙count錛夌殑鍔炴硶錛堥櫎姝や箣澶栫悊璁轟笂榪樻湁鐢ㄥ驚鐜摼琛ㄧ殑鍔炴硶錛屼笉榪囨病鏈夊疄渚嬶級銆傚叿浣撴潵璇達紝shared_ptr<Foo> 鍖呭惈涓や釜鎴愬憳錛屼竴涓槸鎸囧悜 Foo 鐨勬寚閽?ptr錛屽彟涓涓槸 ref_count 鎸囬拡錛堝叾綾誨瀷涓嶄竴瀹氭槸鍘熷鎸囬拡錛屾湁鍙兘鏄?class 綾誨瀷錛屼絾涓嶅獎鍝嶈繖閲岀殑璁ㄨ錛夛紝鎸囧悜鍫嗕笂鐨?ref_count 瀵硅薄銆俽ef_count 瀵硅薄鏈夊涓垚鍛橈紝鍏蜂綋鐨勬暟鎹粨鏋勫鍥?1 鎵紺猴紝鍏朵腑 deleter 鍜?allocator 鏄彲閫夌殑銆?/p> 鍥?1錛歴hared_ptr 鐨勬暟鎹粨鏋勩?/p> 涓轟簡綆鍖栧茍紿佸嚭閲嶇偣錛屽悗鏂囧彧鐢誨嚭 use_count錛?/p> 浠ヤ笂鏄?shared_ptr<Foo> x(new Foo); 瀵瑰簲鐨勫唴瀛樻暟鎹粨鏋勩?/p> 濡傛灉鍐嶆墽琛?shared_ptr<Foo> y = x; 閭d箞瀵瑰簲鐨勬暟鎹粨鏋勫涓嬨?/p> 浣嗘槸 y=x 娑夊強涓や釜鎴愬憳鐨勫鍒訛紝榪欎袱姝ユ嫹璐濅笉浼氬悓鏃訛紙鍘熷瓙錛夊彂鐢熴?/p> 涓棿姝ラ 1錛屽鍒?ptr 鎸囬拡錛?/p> 涓棿姝ラ 2錛屽鍒?ref_count 鎸囬拡錛屽鑷村紩鐢ㄨ鏁板姞 1錛?/p> 姝ラ1鍜屾楠?鐨勫厛鍚庨『搴忚窡瀹炵幇鐩稿叧錛堝洜姝ゆ楠?2 閲屾病鏈夌敾鍑?y.ptr 鐨勬寚鍚戯級錛屾垜瑙佽繃鐨勯兘鏄厛1鍚?銆?/p> 鏃㈢劧 y=x 鏈変袱涓楠わ紝濡傛灉娌℃湁 mutex 淇濇姢錛岄偅涔堝湪澶氱嚎紼嬮噷灝辨湁 race condition銆?/p> 鑰冭檻涓涓畝鍗曠殑鍦烘櫙錛屾湁 3 涓?shared_ptr<Foo> 瀵硅薄 x銆乬銆乶錛?/p> 涓寮濮嬶紝鍚勫畨鍏朵簨銆?/p> 綰跨▼ A 鎵ц x = g; 錛堝嵆 read g錛夛紝浠ヤ笅瀹屾垚浜嗘楠?1錛岃繕娌℃潵鍙婃墽琛屾楠?2銆傝繖鏃跺垏鎹㈠埌浜?B 綰跨▼銆?/p> 鍚屾椂緙栫▼ B 鎵ц g = n; 錛堝嵆 write G錛夛紝涓や釜姝ラ涓璧峰畬鎴愪簡銆?/p> 鍏堟槸姝ラ 1錛?/p> 鍐嶆槸姝ラ 2錛?/p> 榪欐槸 Foo1 瀵硅薄宸茬粡閿姣侊紝x.ptr 鎴愪簡絀烘偓鎸囬拡錛?/p> 鏈鍚庡洖鍒扮嚎紼?A錛屽畬鎴愭楠?2錛?/p> 澶氱嚎紼嬫棤淇濇姢鍦拌鍐?g錛岄犳垚浜?#8220;x 鏄┖鎮寚閽?#8221;鐨勫悗鏋溿傝繖姝f槸澶氱嚎紼嬭鍐欏悓涓涓?shared_ptr 蹇呴』鍔犻攣鐨勫師鍥犮?/p> 褰撶劧錛宺ace condition 榪滀笉姝㈣繖涓縐嶏紝鍏朵粬綰跨▼浜ょ粐錛坕nterweaving錛夋湁鍙兘浼氶犳垚鍏朵粬閿欒銆?/p> 鎬濊冿紝鍋囧 shared_ptr 鐨?operator= 瀹炵幇鏄厛澶嶅埗 ref_count錛堟楠?2錛夊啀澶嶅埗 ptr錛堟楠?1錛夛紝浼氭湁鍝簺 race condition錛?/p> 濡傛灉鎶?boost::shared_ptr 鏀懼埌 unordered_set 涓紝鎴栬呯敤浜?unordered_map 鐨?key錛岄偅涔堣灝忓績 hash table 閫鍖栦負閾捐〃銆?a title="http://stackoverflow.com/questions/6404765/c-shared-ptr-as-unordered-sets-key/12122314#12122314" >http://stackoverflow.com/questions/6404765/c-shared-ptr-as-unordered-sets-key/12122314#12122314 鐩村埌 Boost 1.47.0 鍙戝竷涔嬪墠錛寀nordered_set<std::shared_ptr<T> > 铏界劧鍙互緙栬瘧閫氳繃錛屼絾鏄叾 hash_value 鏄?shared_ptr 闅愬紡杞崲涓?bool 鐨勭粨鏋溿備篃灝辨槸璇達紝濡傛灉涓嶈嚜瀹氫箟hash鍑芥暟錛岄偅涔?unordered_{set/map} 浼氶鍖栦負閾捐〃銆?a title="https://svn.boost.org/trac/boost/ticket/5216" >https://svn.boost.org/trac/boost/ticket/5216 Boost 1.51 鍦?boost/functional/hash/extensions.hpp 涓鍔犱簡鏈夊叧閲嶈澆錛岀幇鍦ㄥ彧瑕佸寘鍚繖涓ご鏂囦歡灝辮兘瀹夊叏楂樻晥鍦頒嬌鐢?unordered_set<std::shared_ptr> 浜嗐?/p> 榪欎篃鏄?muduo 鐨?examples/idleconnection 紺轟緥瑕佽嚜宸卞畾涔?hash_value(const boost::shared_ptr<T>& x) 鍑芥暟鐨勫師鍥狅紙涔︾ 7.10.2 鑺傦紝p.255錛夈傚洜涓?Debian 6 Squeeze銆乁buntu 10.04 LTS 閲岀殑 boost 鐗堟湰閮芥湁榪欎釜 bug銆?/p> shared_ptr<Foo> sp(new Foo) 鍦ㄦ瀯閫?sp 鐨勬椂鍊欐崟鑾蜂簡 Foo 鐨勬瀽鏋勮涓恒傚疄闄呬笂 shared_ptr.ptr 鍜?ref_count.ptr 鍙互鏄笉鍚岀殑綾誨瀷錛堝彧瑕佸畠浠箣闂村瓨鍦ㄩ殣寮忚漿鎹級錛岃繖鏄?shared_ptr 鐨勪竴澶у姛鑳姐傚垎 3 鐐規潵璇達細 1. 鏃犻渶铏氭瀽鏋勶紱鍋囪 Bar 鏄?Foo 鐨勫熀綾伙紝浣嗘槸 Bar 鍜?Foo 閮芥病鏈夎櫄鏋愭瀯銆?/p> shared_ptr<Foo> sp1(new Foo); // ref_count.ptr 鐨勭被鍨嬫槸 Foo* shared_ptr<Bar> sp2 = sp1; // 鍙互璧嬪鹼紝鑷姩鍚戜笂杞瀷錛坲p-cast錛?/p> sp1.reset(); // 榪欐椂 Foo 瀵硅薄鐨勫紩鐢ㄨ鏁伴檷涓?1 姝ゅ悗 sp2 浠嶇劧鑳藉畨鍏ㄥ湴綆$悊 Foo 瀵硅薄鐨勭敓鍛芥湡錛屽茍瀹夊叏瀹屾暣鍦伴噴鏀?Foo錛屽洜涓哄叾 ref_count 璁頒綇浜?Foo 鐨勫疄闄呯被鍨嬨?/p> 2. shared_ptr<void> 鍙互鎸囧悜騫跺畨鍏ㄥ湴綆$悊錛堟瀽鏋勬垨闃叉鏋愭瀯錛変換浣曞璞★紱muduo::net::Channel class 鐨?tie() 鍑芥暟灝變嬌鐢ㄤ簡榪欎竴鐗規э紝闃叉瀵硅薄榪囨棭鏋愭瀯錛岃涔?7.15.3 鑺傘?/p> shared_ptr<Foo> sp1(new Foo); // ref_count.ptr 鐨勭被鍨嬫槸 Foo* shared_ptr<void> sp2 = sp1; // 鍙互璧嬪鹼紝Foo* 鍚?void* 鑷姩杞瀷 sp1.reset(); // 榪欐椂 Foo 瀵硅薄鐨勫紩鐢ㄨ鏁伴檷涓?1 姝ゅ悗 sp2 浠嶇劧鑳藉畨鍏ㄥ湴綆$悊 Foo 瀵硅薄鐨勭敓鍛芥湡錛屽茍瀹夊叏瀹屾暣鍦伴噴鏀?Foo錛屼笉浼氬嚭鐜?delete void* 鐨勬儏鍐碉紝鍥犱負 delete 鐨勬槸 ref_count.ptr錛屼笉鏄?sp2.ptr銆?/p> 3. 澶氱戶鎵褲?/strong>鍋囪 Bar 鏄?Foo 鐨勫涓熀綾諱箣涓錛岄偅涔堬細 shared_ptr<Foo> sp1(new Foo); shared_ptr<Bar> sp2 = sp1; // 榪欐椂 sp1.ptr 鍜?sp2.ptr 鍙兘鎸囧悜涓嶅悓鐨勫湴鍧錛屽洜涓?Bar subobject 鍦?Foo object 涓殑 offset 鍙兘涓嶄負0銆?/p> sp1.reset(); // 姝ゆ椂 Foo 瀵硅薄鐨勫紩鐢ㄨ鏁伴檷涓?1 浣嗘槸 sp2 浠嶇劧鑳藉畨鍏ㄥ湴綆$悊 Foo 瀵硅薄鐨勭敓鍛芥湡錛屽茍瀹夊叏瀹屾暣鍦伴噴鏀?Foo錛屽洜涓?delete 鐨勪笉鏄?Bar*錛岃屾槸鍘熸潵鐨?Foo*銆傛崲鍙ヨ瘽璇達紝sp2.ptr 鍜?ref_count.ptr 鍙兘鍏鋒湁涓嶅悓鐨勫鹼紙褰撶劧瀹冧滑鐨勭被鍨嬩篃涓嶅悓錛夈?/p> 涓轟簡鑺傜渷涓嬈″唴瀛樺垎閰嶏紝鍘熸潵 shared_ptr<Foo> x(new Foo); 闇瑕佷負 Foo 鍜?ref_count 鍚勫垎閰嶄竴嬈″唴瀛橈紝鐜板湪鐢?make_shared() 鐨勮瘽錛屽彲浠ヤ竴嬈″垎閰嶄竴鍧楄凍澶熷ぇ鐨勫唴瀛橈紝渚?Foo 鍜?ref_count 瀵硅薄瀹硅韓銆傛暟鎹粨鏋勬槸錛?/p> 涓嶈繃 Foo 鐨勬瀯閫犲嚱鏁板弬鏁拌浼犵粰 make_shared()錛屽悗鑰呭啀浼犵粰 Foo::Foo()錛岃繖鍙湁鍦?C++11 閲岄氳繃 perfect forwarding 鎵嶈兘瀹岀編瑙e喅銆?/p> (.瀹?)shared_ptr 鐨勬暟鎹粨鏋?/h1>


澶氱嚎紼嬫棤淇濇姢璇誨啓 shared_ptr 鍙兘鍑虹幇鐨?race condition
鏉傞」
shared_ptr 浣滀負 unordered_map 鐨?key
涓轟粈涔堝浘 1 涓殑 ref_count 涔熸湁鎸囧悜 Foo 鐨勬寚閽堬紵
涓轟粈涔堣灝介噺浣跨敤 make_shared()錛?/h2>
]]>