[問題] atomic_compare_exchange與shared_ptr
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 14.0
程式碼(Code):(請善用置底文網頁, 記得排版)
(新的)
http://ideone.com/rE4K3N
沒問題了
(原文)
http://ideone.com/dmc08e
我覺得thr_stack::pop應該有寫對才對
可是VC++執行到一直會崩潰
然而我用gcc 5.3.0就正常執行的,都沒有錯誤
所以想問各位,
1. 是VC++ 14.0有錯?
2. 還是code有寫錯?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.70.26
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458646640.A.28D.html
推
03/22 22:01, , 1F
03/22 22:01, 1F
→
03/22 22:03, , 2F
03/22 22:03, 2F
→
03/22 22:03, , 3F
03/22 22:03, 3F
→
03/22 22:05, , 4F
03/22 22:05, 4F
→
03/22 22:07, , 5F
03/22 22:07, 5F
你說的應該是這種情況吧
http://imgur.com/5ybOEQ6

假設有3個pop,如第一張圖
當第一個pop做完,且另外兩個pop還未進入while時,就會變第二張圖
當第二個pop做完,且另外一個pop還未進入while時,就會變第三張圖
也就是說,需要
1. 有一個pop卡在執行完atomic_load後,未執行while前
2. 有非常多其他的pop執行完畢
才可以達到stack overflow的條件(這情況應該很稀有才對)
感謝幫忙,我已經修掉了
另外,shared_ptr沒有ABA的問題
推
03/23 12:00, , 6F
03/23 12:00, 6F
→
03/23 12:00, , 7F
03/23 12:00, 7F
那個網址我看了,但是
atomic_compare_exchange系列
當object是shared_ptr時,compare是用memcmp
當object非shared_ptr時,compare是用get()==get()&&share ownership
然而emplace每次都會呼叫make_shared,因此每次都是一個新的shared_ptr
get()不可能與get()相等才對
推
03/23 17:03, , 8F
03/23 17:03, 8F
→
03/23 17:04, , 9F
03/23 17:04, 9F
→
03/23 17:04, , 10F
03/23 17:04, 10F
→
03/23 17:11, , 11F
03/23 17:11, 11F
我誤會你的意思了 XD
因為這是一個要拿來抓錯誤的code,所以其他非必要的因素(如lock-free emplace、empty、is_lock_free)都省略了
真正的code是有處理這問題的
推
03/23 17:21, , 12F
03/23 17:21, 12F
→
03/23 17:21, , 13F
03/23 17:21, 13F
→
03/23 17:24, , 14F
03/23 17:24, 14F
非常感謝你 <(_ _)>
沒有用第三方library是因為我有在做threadpool
在threadpool達到所有我需要的要求之前
我希望所有class都是由我自己打造出來
這樣才能保證
1.最快
2.不需要經過其他library
3.只靠C++(不用直接呼叫平台相關的api)
※ 編輯: Caesar08 (1.171.70.26), 03/23/2016 17:40:19
推
03/23 17:48, , 15F
03/23 17:48, 15F