VCZH.粉絲數組[0]<errorcpp@qq.com> 21:49:07
atomic的 compare_exchange_weak
compare_exchange_weak
有啥區別
SC5BVG@Z77TFAZI3REO[}R.gif)
求解釋
vczh.Iskandar<vczh@163.com> 21:49:27
不是一樣嗎
御虛舟北(314969051) 21:49:40
改代碼中, ing
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:49:49
Windows上的實現是一樣的
May fail spuriously, so must generally be retried in a loop.
這一句怎么理解呢
vczh.Iskandar<vczh@163.com> 21:50:07
compare_exchange_weak
compare_exchange_weak
質量最大vczh粉(402740419) 21:50:14
compare_exchange_weak
compare_exchange_weak
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:50:16
strong
compare_exchange_strong
還有一個問題
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了
vczh.Iskandar<vczh@163.com> 21:51:50
不用compare
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:51:59
\Tencent\QQ\PersonalData\85126585\Image\Image3\HY)ZO7GDOQ)]Q8H(Q}8WQ~S.gif)
為啥
無法理解
vczh.Iskandar<vczh@163.com> 21:52:34
想要解釋好麻煩
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:52:40
還有在Windows上
boost::memory_order_acquire
這個參數也沒用
貌似
AJTFW.gif)
求V神解釋
還有strong和weak的區別
質量最大vczh粉(402740419) 21:54:46
spinlock本來就不用compare啊
直接swap就行了
while (state_.swap(1) == 1);
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:56:24
你看假設現在是lock狀態
boost的實現是無條件吧lock換成unlock
如果是繼續lock 他還是lock
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:58:08
只要要避免 重入吧
lock之前檢查一下
御虛舟北(314969051) 22:00:03
小康你的書收到沒有
質量最大vczh粉(402740419) 22:03:17
VCZH.粉絲數組[0]<errorcpp@qq.com> 21:58:08
只要要避免 重入吧
lock之前檢查一下
你用錯了他不管你
就是這個意思
同一個線程lock兩次也會死鎖
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:05:05
\Tencent\QQ\PersonalData\85126585\Image\Image3\HY)ZO7GDOQ)]Q8H(Q}8WQ~S.gif)
原來是這樣
但是他lock的時候不檢查,也會導致兩個線程同時lock吧?
while (state_.exchange(Locked, boost::memory_order_acquire) == Locked) {
/* busy-wait */
}
質量最大vczh粉(402740419) 22:05:18
不會啊
假設A進程先來了,lock成功了
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:05:33
怎能理解,我理解和直接賦值是一樣
我再去看
質量最大vczh粉(402740419) 22:05:40
這不是復制
是exchange
swap
另一個線程exchange就會收到Locked
那么另一個線程就會while循環,直到原來線程給設置了Unlocked
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:06:47
Exchange current value with new_value, returning current value
exchange是把新值寫入舊值返回么? 不是這樣么?
我有點理解了
質量最大vczh粉(402740419) 22:07:46
對啊,新值寫入,舊值返回,原子的
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:07:59
就是說寫入也是寫入的lock, 不影響之前的lock
當前線程拿到舊值檢查是不是lock狀態,如果是就繼續嘗試直到不是
質量最大vczh粉(402740419) 22:08:00
所以只會有一個線程返回Unlocked,另一個線程會收到之前線程設置的Locked
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:08:11
受教了
質量最大vczh粉(402740419) 22:08:13
恩
VCZH.粉絲數組[0]<errorcpp@qq.com> 22:08:20
我貼到博客上去