推 LiloHuang: 先不探討 ABA 問題,程式會崩潰是因為 stack overflow 03/22 22:01
→ LiloHuang: 做個實驗把 default stack size 改成 100 MB 看看 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
那個網址我看了,但是
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
我誤會你的意思了 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