[問題] atomic_compare_exchange與shared_ptr

看板C_and_CPP作者 (Caesar)時間9年前 (2016/03/22 19:37), 9年前編輯推噓5(5010)
留言15則, 1人參與, 最新討論串1/1
開發平台(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
先不探討 ABA 問題,程式會崩潰是因為 stack overflow
03/22 22:01, 1F

03/22 22:03, , 2F
做個實驗把 default stack size 改成 100 MB 看看
03/22 22:03, 2F

03/22 22:03, , 3F
請參考 https://goo.gl/1ABvms 然後改成 104857600
03/22 22:03, 3F

03/22 22:05, , 4F
因為 std::shared_ptr<T> 的 destrustor 又呼叫了下一
03/22 22:05, 4F

03/22 22:07, , 5F
個節點的 destructor,當節點數量級很大時就會崩潰
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
emplace 如果支援 concurrent operaton 就得留意 ABA
03/23 12:00, 6F

03/23 12:00, , 7F
可參考 https://goo.gl/3LxPZ0 維基百科的詳盡的例子
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
你的 emplace 有 race condition 的問題,假設有兩個
03/23 17:03, 8F

03/23 17:04, , 9F
threads 都正在做 std::make_shared<T> 還沒有返回值
03/23 17:04, 9F

03/23 17:04, , 10F
請問之後 _begin 會更新成哪一個?
03/23 17:04, 10F

03/23 17:11, , 11F
劍橋大學CS的課堂範例 https://goo.gl/i9H6Kl 再多想想
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
lock-free container (queue/stack) 得多留意 ABA 一下
03/23 17:21, 13F

03/23 17:24, , 14F
另外,實際應用建議使用 Intel TBB library 省時省力
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
可以多玩玩第三方 library,看看別人有什麼功能也不錯
03/23 17:48, 15F
文章代碼(AID): #1MyIvmAD (C_and_CPP)