Go璇█atomic鍘熷瓙鎿嶄綔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go璇█atomic鍘熷瓙鎿嶄綔相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/%e5%85%b3%e5%bf%83' title='鍏冲績'>鍏冲績   targe   婧愮爜   瑙f瀽   鎺ュ彈   浼樺娍   濂芥枃   鍒涘缓   com   

atomic鏄渶杞婚噺绾х殑閿?鍦ㄤ竴浜涘満鏅笅鐩存帴浣跨敤atomic鍖呰繕鏄緢鏈夋晥鐨勩€?br>
涓嬮潰鍐呭鎽樼鑷?a href="http://ifeve.com/go-concurrency-atomic/" target="_blank">銆奊O骞跺彂缂栫▼瀹炴垬銆嬧€斺€?鍘熷瓙鎿嶄綔: 
        CAS鎿嶄綔鐨勪紭鍔挎槸锛屽彲浠ュ湪涓嶅舰鎴愪复鐣屽尯鍜屽垱寤轰簰鏂ラ噺鐨勬儏鍐典笅瀹屾垚骞跺彂瀹夊叏鐨勫€兼浛鎹㈡搷浣溿€?br>杩欏彲浠ュぇ澶х殑鍑忓皯鍚屾瀵圭▼搴忔€ц兘鐨勬崯鑰椼€? 
褰撶劧锛孋AS鎿嶄綔涔熸湁鍔e娍銆傚湪琚搷浣滃€艰棰戠箒鍙樻洿鐨勬儏鍐典笅锛孋AS鎿嶄綔骞朵笉閭d箞瀹规槗鎴愬姛銆?br>
鍘熷瓙鎿嶄綔鍏辨湁5绉嶏紝鍗筹細澧炴垨鍑忋€佹瘮杈冨苟浜ゆ崲銆佽浇鍏ャ€佸瓨鍌ㄥ拰浜ゆ崲

 1. 澧炴垨鍑?/strong>
      琚敤浜庤繘琛屽鎴栧噺鐨勫師瀛愭搷浣滐紙浠ヤ笅绠€绉板師瀛愬/鍑忔搷浣滐級鐨勫嚱鏁板悕绉伴兘浠モ€淎dd鈥濅负鍓嶇紑锛屽苟鍚庤窡閽堝鐨勫叿浣撶被鍨嬬殑鍚嶇О銆?br>涓嶈繃锛岀敱浜巃tomic.AddUint32鍑芥暟鍜宎tomic.AddUint64鍑芥暟鐨勭浜屼釜鍙傛暟鐨勭被鍨嬪垎鍒槸uint32鍜寀int64锛屾墍浠ユ垜浠棤娉曢€氳繃浼犻€掍竴涓礋鐨勬暟鍊兼潵鍑忓皬琚搷浣滃€笺€?br>atomic.AddUint32(&ui32, ^uint32(-NN-1))      鍏朵腑NN浠h〃浜嗕竴涓礋鏁存暟

2. 姣旇緝骞朵氦鎹?/strong>
      func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
绗竴涓弬鏁扮殑鍊煎簲璇ユ槸鎸囧悜琚搷浣滃€肩殑鎸囬拡鍊笺€傝鍊肩殑绫诲瀷鍗充负*int32銆?br>鍚庝袱涓弬鏁扮殑绫诲瀷閮芥槸int32绫诲瀷銆傚畠浠殑鍊煎簲璇ュ垎鍒唬琛ㄨ鎿嶄綔鍊肩殑鏃у€煎拰鏂板€?br>CompareAndSwapInt32鍑芥暟鍦ㄨ璋冪敤涔嬪悗浼氬厛鍒ゆ柇鍙傛暟addr鎸囧悜鐨勮鎿嶄綔鍊间笌鍙傛暟old鐨勫€兼槸鍚︾浉绛夈€?br>浠呭綋姝ゅ垽鏂緱鍒拌偗瀹氱殑缁撴灉涔嬪悗锛岃鍑芥暟鎵嶄細鐢ㄥ弬鏁皀ew浠h〃鐨勬柊鍊兼浛鎹㈡帀鍘熷厛鐨勬棫鍊笺€傚惁鍒欙紝鍚庨潰鐨勬浛鎹㈡搷浣滃氨浼氳蹇界暐銆?br>
3. 杞藉叆
       v := atomic.LoadInt32(&value)
 鍑芥暟atomic.LoadInt32鎺ュ彈涓€涓?int32绫诲瀷鐨勬寚閽堝€硷紝骞朵細杩斿洖璇ユ寚閽堝€兼寚鍚戠殑閭d釜鍊?/p>

 鏈変簡鈥滃師瀛愮殑鈥濊繖涓舰瀹硅瘝灏辨剰鍛崇潃锛屽湪杩欓噷璇诲彇value鐨勫€肩殑鍚屾椂锛屽綋鍓嶈绠楁満涓殑浠讳綍CPU閮戒笉浼氳繘琛屽叾瀹冪殑閽堝姝ゅ€肩殑璇绘垨鍐欐搷浣溿€?/p>

杩欐牱鐨勭害鏉熸槸鍙楀埌搴曞眰纭欢鐨勬敮鎸佺殑銆?/p>


4. 瀛樺偍
  鍦ㄥ師瀛愮殑瀛樺偍鏌愪釜鍊肩殑杩囩▼涓紝浠讳綍CPU閮戒笉浼氳繘琛岄拡瀵瑰悓涓€涓€肩殑璇绘垨鍐欐搷浣溿€?br>濡傛灉鎴戜滑鎶婃墍鏈夐拡瀵规鍊肩殑鍐欐搷浣滈兘鏀逛负鍘熷瓙鎿嶄綔锛岄偅涔堝氨涓嶄細鍑虹幇閽堝姝ゅ€肩殑璇绘搷浣滃洜琚苟鍙戠殑杩涜鑰岃鍒颁慨鏀逛簡涓€鍗婄殑鍊肩殑鎯呭喌浜嗐€?br>鍘熷瓙鐨勫€煎瓨鍌ㄦ搷浣滄€讳細鎴愬姛锛屽洜涓哄畠骞朵笉浼氬叧蹇冭鎿嶄綔鍊肩殑鏃у€兼槸浠€涔堛€?br>鍑芥暟atomic.StoreInt32浼氭帴鍙椾袱涓弬鏁般€傜涓€涓弬鏁扮殑绫诲瀷鏄?int 32绫诲瀷鐨勶紝鍏跺惈涔夊悓鏍锋槸鎸囧悜琚搷浣滃€肩殑鎸囬拡銆傝€岀浜屼釜鍙傛暟鍒欐槸int32绫诲瀷鐨勶紝瀹冪殑鍊煎簲璇ヤ唬琛ㄦ瀛樺偍鐨勬柊鍊笺€傚叾瀹冪殑鍚岀被鍑芥暟涔熶細鏈夌被浼肩殑鍙傛暟澹版槑鍒楄〃銆?br>
5. 浜ゆ崲
        涓嶤AS鎿嶄綔涓嶅悓锛屽師瀛愪氦鎹㈡搷浣滀笉浼氬叧蹇冭鎿嶄綔鍊肩殑鏃у€笺€傚畠浼氱洿鎺ヨ缃柊鍊笺€備絾瀹冨張姣斿師瀛愯浇鍏ユ搷浣滃鍋氫簡涓€姝ャ€備綔涓轰氦鎹紝瀹冧細杩斿洖琚搷浣滃€肩殑鏃у€笺€傛绫绘搷浣滄瘮CAS鎿嶄綔鐨勭害鏉熸洿灏戯紝鍚屾椂鍙堟瘮鍘熷瓙杞藉叆鎿嶄綔鐨勫姛鑳芥洿寮恒€?br>浠tomic.SwapInt32鍑芥暟涓轰緥銆傚畠鎺ュ彈涓や釜鍙傛暟銆傜涓€涓弬鏁版槸浠h〃浜嗚鎿嶄綔鍊肩殑鍐呭瓨鍦板潃鐨?int32绫诲瀷鍊硷紝鑰岀浜屼釜鍙傛暟鍒欒鐢ㄦ潵琛ㄧず鏂板€笺€傛敞鎰忥紝璇ュ嚱鏁版槸鏈夌粨鏋滃€肩殑銆傝鍊煎嵆鏄鏂板€兼浛鎹㈡帀鐨勬棫鍊笺€俛tomic.SwapInt32鍑芥暟琚皟鐢ㄥ悗锛屼細鎶婄浜屼釜鍙傛暟鍊肩疆浜庣涓€涓弬鏁板€兼墍琛ㄧず鐨勫唴瀛樺湴鍧€涓婏紙鍗充慨鏀硅鎿嶄綔鍊硷級锛屽苟灏嗕箣鍓嶅湪璇ュ湴鍧€涓婄殑閭d釜鍊间綔涓虹粨鏋滆繑鍥炪€?br>
渚嬪瓙:
df.rmutex.Lock()
defer df.rmutex.Unlock()
return df.roffset / int64(df.dataLen)
鎴戜滑鐜板湪鍘绘帀鏂藉姞鍦ㄤ笂闈㈢殑閿佸畾鍜岃В閿佹搷浣滐紝杞€屼娇鐢ㄥ師瀛愭搷浣滄潵瀹炵幇瀹冦€備慨鏀瑰悗鐨勪唬鐮佸涓嬶細
offset := atomic.LoadInt64(&df.roffset)
return offset / int64(df.dataLen)


鐢ㄥ師瀛愭搷浣滄潵鏇挎崲mutex閿?br>

鍏朵富瑕佸師鍥犳槸锛屽師瀛愭搷浣滅敱搴曞眰纭欢鏀寔锛岃€岄攣鍒欑敱鎿嶄綔绯荤粺鎻愪緵鐨凙PI瀹炵幇銆傝嫢瀹炵幇鐩稿悓鐨勫姛鑳斤紝鍓嶈€呴€氬父浼氭洿鏈夋晥鐜囥€?/strong> 

鍏充簬atomic,骞跺彂缂栫▼鐨勪綔鑰呰寰堢粏寰堟竻妤氾紝鍐嶅彲浠ョ湅鐪嬩笅闈袱绡囧ソ鏂囨。::

Golang 1.3 sync.Mutex 婧愮爜瑙f瀽

Golang 1.3 sync.Atomic婧愮爜瑙f瀽

 

杞浇: https://studygolang.com/articles/3557





























以上是关于Go璇█atomic鍘熷瓙鎿嶄綔的主要内容,如果未能解决你的问题,请参考以下文章

涓€瀵逛竴鍏宠仈鏌ヨ鏃朵娇鐢╮elation杩炶疮鎿嶄綔鏌ヨ鍚庯紝璋冪敤getLastSql()鏂规硶杈撳嚭鐨剆ql璇彞

Java鎿嶄綔JSON鏁版嵁--Gson鎿嶄綔JSON鏁版嵁

鏁版嵁缁撴瀯-C璇█瀹炵幇-閾炬爤

鎿嶄綔绯荤粺-鎿嶄綔绯荤粺-鍐呮牳涓殑灞忓箷鎵撳嵃(涓?

鏁版嵁搴撶瑪璁?馃搾 MySQL鍩虹鎿嶄綔鍛戒护 鍒嗙被娓呮櫚

Django--鍗曡〃鎿嶄綔