看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
LiloHuang: 先不探討 ABA 問題,程式會崩潰是因為 stack overflow 03/22 22:01
LiloHuang: 做個實驗把 default stack size 改成 100 MB 看看 03/22 22:03
LiloHuang: 請參考 https://goo.gl/1ABvms 然後改成 104857600 03/22 22:03
LiloHuang: 因為 std::shared_ptr<T> 的 destrustor 又呼叫了下一 03/22 22:05
LiloHuang: 個節點的 destructor,當節點數量級很大時就會崩潰 03/22 22:07
你說的應該是這種情況吧 http://imgur.com/5ybOEQ6 假設有3個pop,如第一張圖 當第一個pop做完,且另外兩個pop還未進入while時,就會變第二張圖 當第二個pop做完,且另外一個pop還未進入while時,就會變第三張圖 也就是說,需要 1. 有一個pop卡在執行完atomic_load後,未執行while前 2. 有非常多其他的pop執行完畢 才可以達到stack overflow的條件(這情況應該很稀有才對) 感謝幫忙,我已經修掉了 另外,shared_ptr沒有ABA的問題
LiloHuang: emplace 如果支援 concurrent operaton 就得留意 ABA 03/23 12:00
LiloHuang: 可參考 https://goo.gl/3LxPZ0 維基百科的詳盡的例子 03/23 12:00
那個網址我看了,但是 atomic_compare_exchange系列 當object是shared_ptr時,compare是用memcmp 當object非shared_ptr時,compare是用get()==get()&&share ownership 然而emplace每次都會呼叫make_shared,因此每次都是一個新的shared_ptr get()不可能與get()相等才對
LiloHuang: 你的 emplace 有 race condition 的問題,假設有兩個 03/23 17:03
LiloHuang: threads 都正在做 std::make_shared<T> 還沒有返回值 03/23 17:04
LiloHuang: 請問之後 _begin 會更新成哪一個? 03/23 17:04
LiloHuang: 劍橋大學CS的課堂範例 https://goo.gl/i9H6Kl 再多想想 03/23 17:11
我誤會你的意思了 XD 因為這是一個要拿來抓錯誤的code,所以其他非必要的因素(如lock-free emplace、empty、is_lock_free)都省略了 真正的code是有處理這問題的
LiloHuang: :) 我也覺得你誤會了我的意思,我只是想強調一個完整的 03/23 17:21
LiloHuang: lock-free container (queue/stack) 得多留意 ABA 一下 03/23 17:21
LiloHuang: 另外,實際應用建議使用 Intel TBB library 省時省力 03/23 17:24
非常感謝你 <(_ _)> 沒有用第三方library是因為我有在做threadpool 在threadpool達到所有我需要的要求之前 我希望所有class都是由我自己打造出來 這樣才能保證 1.最快 2.不需要經過其他library 3.只靠C++(不用直接呼叫平台相關的api) ※ 編輯: Caesar08 (1.171.70.26), 03/23/2016 17:40:19
LiloHuang: 可以多玩玩第三方 library,看看別人有什麼功能也不錯 03/23 17:48