锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Compare current value with Compare current value with 鍏堢湅涓媌oost緇欑殑渚嬪瓙錛屾垜瑙夊緱鏈夐棶棰橈細
#include <boost/atomic.hpp>
class spinlock {
private:
typedef enum {Locked, Unlocked} LockState;
boost::atomic<LockState> state_;
public:
spinlock() : state_(Unlocked) {}
void lock()
{
// 鍙兘榪欓噷鐨刡oost::memory_order_acquire鏈夊師瀛愭搷浣滅殑鏁堟灉鍚э紝鍋朵笉鏄緢鐞嗚В錛屼笉榪囨垜瑙夊緱榪欓噷搴旇鐢╟ae鎿嶄綔鎵嶅
while (state_.exchange(Locked, boost::memory_order_acquire) == Locked) {
/* busy-wait */
}
}
void unlock()
{
// 榪欓噷閮界洿鎺ュ啓涓嶅仛媯鏌ヤ簡錛屾洿鍔犻毦浠ョ悊瑙?
state_.store(Unlocked, boost::memory_order_release);
}
};
鏈夊彲鑳芥槸鎴戜笉鐞嗚В鍚庨潰鐨勫唴瀛樿闂弬鏁扮殑鎰忎箟錛岀粰涓嬫垜鑷繁鐨勫疄鐜幫細
{
private:
typedef enum {emUnlocked = 0, emLocked} EM_LockState;
public:
CESpinLock() : m_atomicState(emLocked)
{
}
public:
void lock()
{
EM_LockState state = emUnlocked;
while(false == m_atomicState.compare_exchange_strong(state, emLocked))
{
state = emUnlocked;
}
}
void unlock()
{
EM_LockState state = emLocked;
while(false == m_atomicState.compare_exchange_strong(state, emUnlocked))
{
state = emLocked;
}
}
private:
boost::atomic<EM_LockState> m_atomicState;
};
鍙互閫傚綋鐨勫湪false閲岃竟鍔犱竴鐐箂leep鎿嶄綔鎰熻銆?br />
榪樻湁涓鐐瑰氨鏄笉澶縺鐑堣繖閲岀殑cae鎿嶄綔鍒嗕袱縐?strong鍜寃eakbool compare_exchange_weak(T & expected, T desired, memory_order success_order, memory_order failure_order) expected, change it to desired if matches. Returns true if an exchange has been performed, and always writes the previous value back in expected. May fail spuriously, so must generally be retried in a loop. bool compare_exchange_strong(T & expected, T desired, memory_order order) expected, change it to desired if matches. Returns true if an exchange has been performed, and always writes the previous value back in expected.
瀹炲湪涓嶇悊瑙?nbsp;May fail spuriously, so must generally be retried in a loop.鐨勬剰涔夛紝涓嶈繃鐪嬩簡浠g爜錛屽湪win32鐨勫疄鐜頒笂錛寃eak鏄皟鐢ㄤ簡stong瀹炵幇鐨勩?br />
atomic鐨?nbsp;compare_exchange_weak
compare_exchange_weak
鏈夊暐鍖哄埆SC5BVG@Z77TFAZI3REO[}R.gif)
姹傝В閲?br />vczh.Iskandar<vczh@163.com> 21:49:27
涓嶆槸涓鏍峰悧
寰¤櫄鑸熷寳(314969051) 21:49:40
鏀逛唬鐮佷腑錛?nbsp;ing
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:49:49
Windows涓婄殑瀹炵幇鏄竴鏍風殑
May fail spuriously, so must generally be retried in a loop.
榪欎竴鍙ユ庝箞鐞嗚В鍛?br />vczh.Iskandar<vczh@163.com> 21:50:07
compare_exchange_weak
compare_exchange_weak
璐ㄩ噺鏈澶czh綺?402740419) 21:50:14
compare_exchange_weak
compare_exchange_weak
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:50:16
strong
compare_exchange_strong
榪樻湁涓涓棶棰?br />class spinlock {
private:
typedef enum {Locked, Unlocked} LockState;
boost::atomic<LockState> state_;
public:
spinlock() : state_(Unlocked) {}
void lock()
{
while (state_.exchange(Locked, boost::memory_order_acquire) == Locked) {
/* busy-wait */
}
}
void unlock()
{
state_.store(Unlocked, boost::memory_order_release);
}
};
boost渚嬪瓙緇欑殑 spinloc
鎬庝箞鏄繖鏍峰疄鐜扮殑
閮芥病鏈夌敤cae鎿嶄綔
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:51:20
unlock閮界洿鎺ョ敤store浜?br />vczh.Iskandar<vczh@163.com> 21:51:50
涓嶇敤compare
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:51:59
涓哄暐
鏃犳硶鐞嗚В
vczh.Iskandar<vczh@163.com> 21:52:34
鎯寵瑙i噴濂介夯鐑?br />VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:52:40
榪樻湁鍦╓indows涓?br />boost::memory_order_acquire
榪欎釜鍙傛暟涔熸病鐢?br />璨屼技
姹俈紲炶В閲?br />榪樻湁strong鍜寃eak鐨勫尯鍒?br />璐ㄩ噺鏈澶czh綺?402740419) 21:54:46
spinlock鏈潵灝變笉鐢╟ompare鍟?br />鐩存帴swap灝辮浜?br />while (state_.swap(1) == 1);
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:56:24
浣犵湅鍋囪鐜板湪鏄痩ock鐘舵?br />boost鐨勫疄鐜版槸鏃犳潯浠跺惂lock鎹㈡垚unlock
濡傛灉鏄戶緇璴ock 浠栬繕鏄痩ock
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:58:08
鍙瑕侀伩鍏?nbsp;閲嶅叆鍚?br />lock涔嬪墠媯鏌ヤ竴涓?br />寰¤櫄鑸熷寳(314969051) 22:00:03
灝忓悍浣犵殑涔︽敹鍒版病鏈?br />璐ㄩ噺鏈澶czh綺?402740419) 22:03:17
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 21:58:08
鍙瑕侀伩鍏?nbsp;閲嶅叆鍚?br />lock涔嬪墠媯鏌ヤ竴涓?br />
浣犵敤閿欎簡浠栦笉綆′綘
灝辨槸榪欎釜鎰忔?br />鍚屼竴涓嚎紼媗ock涓ゆ涔熶細姝婚攣
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:05:05
鍘熸潵鏄繖鏍?br />
浣嗘槸浠杔ock鐨勬椂鍊欎笉媯鏌ワ紝涔熶細瀵艱嚧涓や釜綰跨▼鍚屾椂lock鍚э紵
while (state_.exchange(Locked, boost::memory_order_acquire) == Locked) {
/* busy-wait */
}
璐ㄩ噺鏈澶czh綺?402740419) 22:05:18
涓嶄細鍟?br />鍋囪A榪涚▼鍏堟潵浜嗭紝lock鎴愬姛浜?br />VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:05:33
鎬庤兘鐞嗚В錛屾垜鐞嗚В鍜岀洿鎺ヨ祴鍊兼槸涓鏍?br />鎴戝啀鍘葷湅
璐ㄩ噺鏈澶czh綺?402740419) 22:05:40
榪欎笉鏄鍒?br />鏄痚xchange
swap
鍙︿竴涓嚎紼媏xchange灝變細鏀跺埌Locked
閭d箞鍙︿竴涓嚎紼嬪氨浼歸hile寰幆錛岀洿鍒板師鏉ョ嚎紼嬬粰璁劇疆浜哢nlocked
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:06:47
Exchange current value with new_value, returning current value
exchange鏄妸鏂板煎啓鍏ユ棫鍊艱繑鍥炰箞錛?nbsp; 涓嶆槸榪欐牱涔堬紵
鎴戞湁鐐圭悊瑙d簡
璐ㄩ噺鏈澶czh綺?402740419) 22:07:46
瀵瑰晩錛屾柊鍊煎啓鍏ワ紝鏃у艱繑鍥烇紝鍘熷瓙鐨?br />VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:07:59
灝辨槸璇村啓鍏ヤ篃鏄啓鍏ョ殑lock錛?nbsp;涓嶅獎鍝嶄箣鍓嶇殑lock
褰撳墠綰跨▼鎷垮埌鏃у兼鏌ユ槸涓嶆槸lock鐘舵侊紝濡傛灉鏄氨緇х畫灝濊瘯鐩村埌涓嶆槸
璐ㄩ噺鏈澶czh綺?402740419) 22:08:00
鎵浠ュ彧浼氭湁涓涓嚎紼嬭繑鍥濽nlocked錛屽彟涓涓嚎紼嬩細鏀跺埌涔嬪墠綰跨▼璁劇疆鐨凩ocked
VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:08:11
鍙楁暀浜?br />璐ㄩ噺鏈澶czh綺?402740419) 22:08:13
鎭?br />VCZH.綺変笣鏁扮粍[0]<errorcpp@qq.com> 22:08:20
鎴戣創鍒板崥瀹笂鍘?nbsp;
]]>