lock-free

    2熱度

    1回答

    以下是方案。鮑勃是一位作家,愛麗絲是一位讀者。鮑勃寫東西,艾麗斯讀它們。規則是: 1)Bob可以寫出Alice是否正在讀取(讀取不阻止寫入)。 2)當鮑勃寫信時,艾麗斯無法讀取(寫入塊讀取)。 3)當Alice完成閱讀時,她可以知道Bob在她的閱讀過程中是否寫過(讀者可以檢測到他們剛纔閱讀的數據是否無效)。 2)和3)實際上是一個組合規則,但我列出了兩個好的討論。這個問題可以通過一個互斥體和一個計

    23熱度

    1回答

    直到現在我在我的項目中使用std::queue。我測量了此隊列上特定操作所需的平均時間。 時間是在2臺機器上測得的:我的本地Ubuntu VM和遠程服務器。 使用std::queue,兩臺機器的平均值幾乎相同:〜750微秒。 然後,我將std::queue「升級」爲boost::lockfree::spsc_queue,這樣我就可以擺脫保護隊列的互斥鎖。在我的本地虛擬機上,我可以看到巨大的性能增益

    6熱度

    2回答

    我在crossbeam中遇到了回收內存的問題。假設你正在實現一個簡單的線程安全的無鎖容器,它只保存一個值。任何線程都可以獲得存儲值的克隆,並且可以隨時更新值,然後讀者開始觀察新值的克隆。 雖然典型的用例是指定像Arc<X>爲T,執行不能依靠T爲指針大小 - 例如,X可能是一個特點,導致脂肪指針Arc<X>。但是,無鎖地訪問任意T似乎非常適合於epoch-based lock-free code。基

    1熱度

    1回答

    滿足無鎖進程保證的編寫算法或數據結構的困難之一是動態內存分配:調用類似malloc或new的調用不保證以便攜方式無鎖。然而,存在許多無鎖實現malloc或new,並且還有各種可用於實現無鎖算法/數據結構的無鎖內存分配器。 但是,我仍然不明白如何實際上完全滿足無鎖進度保證,除非你特別限制你的數據結構或算法到一些預先分配的靜態內存池。但是,如果你需要動態內存分配,我不明白如何任何指稱的無鎖內存分配器永

    -1熱度

    1回答

    在安東尼·威廉姆斯在行動書併發,他實現了採用分體式引用計數鎖免費棧。在頭節點的初始加載之後。在這裏他使用下面代碼中列出的方法調用increase_head_count。 counted_node_ptr old_head = head.load(); increase_head_count(old_head); void increase_head_count(counted_node_pt

    1熱度

    1回答

    「Treiber Stack」通常是最簡單的無鎖數據結構之一,因此在教授無鎖算法介紹時經常使用它。 我見過很多使用C++ atomics的Treiber Stacks的實現。算法本身是微不足道的,所以真正的挑戰是處理無鎖數據結構的所有其他附帶細節,例如提供某種方式來執行安全的內存回收,避免ABA問題,並以無鎖方式分配節點。這可以通過各種方式解決,例如使用原子引用計數,危險指針,計數/標記指針以避免

    0熱度

    1回答

    我有以下函數updateEntry它將值寫入查找表。我想創建這個函數的多線程版本。 我正在研究原子操作__sync_bool_compare_and_swap,但我不知道如何在這裏正確應用它。 是否理論上可以在沒有鎖定的情況下自動實現此功能,因爲它會更改兩個獨立的存儲位置entryLookup[id]和entry? void updateEntry(Entry ** entryLookup, un

    1熱度

    2回答

    所以鎖定自由是當你有保證整個系統進展,雖然有些線程可能會餓死。所以基於CAS的實現將提供這種保證。 然後無阻塞是當一個線程保證完成,如果所有其他線程都掛起。 你能給出一個簡單的無鎖定算法的例子嗎? 謝謝!

    3熱度

    1回答

    我在C++中發現了一個奇怪的行爲,std::shared_ptr。 以下示例完美適用於標準指針。 但std::shared_ptr的使用導致此處出現分段故障。 (請參閱下面的回溯) 我知道,從多個線程訪問std::shared_ptr並不安全,因此我正在使用原子操作。即使是經典的鎖也不會解決問題。 進出口使用gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ub

    0熱度

    1回答

    從回答我剛纔的問題: Pointers in c++ after delete 它變得清晰,即使用指針的值,即點「刪除」記憶(尤其是將它們複製)導致在C++ 11中的undef行爲和在C++ 14中的實現定義的行爲。 Antomy威廉姆斯在他的著作「C++在行動併發」建議用引用計數的下一個無鎖堆棧: #include <atomic> #include <memory> template<t