鍏堢湅涓媌oost緇欑殑渚嬪瓙錛屾垜瑙夊緱鏈夐棶棰橈細(xì)
#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() {
// 榪欓噷閮界洿鎺ュ啓涓嶅仛媯(gè)鏌ヤ簡(jiǎn)錛屾洿鍔犻毦浠ョ悊瑙? state_.store(Unlocked, boost::memory_order_release); } };
鏈夊彲鑳芥槸鎴戜笉鐞嗚В鍚庨潰鐨勫唴瀛樿闂弬鏁扮殑鎰忎箟錛岀粰涓嬫垜鑷繁鐨勫疄鐜幫細(xì)class CESpinLock : boost::noncopyable
{
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;
};
bool compare_exchange_weak(T & expected, T desired, memory_order success_order, memory_order failure_order)
Compare current value with 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)
Compare current value with 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.鐨勬剰涔夛紝涓嶈繃鐪嬩簡(jiǎn)浠g爜錛屽湪win32鐨勫疄鐜頒笂錛寃eak鏄皟鐢ㄤ簡(jiǎn)stong瀹炵幇鐨勩?br />