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