lock-free

    1熱度

    3回答

    我一直在讀的書叫多處理器編程的藝術和跨職能來到如get()方法,getandset(),compareandset(),getandIncrease(),getandIncrease()等 在它說,這本書上述所有函數都是原子的,我同意,但是我對自己的一些函數如何變成原子函數有了自己的疑問。 爲什麼與功能得到或比較成爲原子? - 因爲它必須等到它達到價值或等待,直到某些條件成爲真實,從而產生障礙,因

    2熱度

    1回答

    比方說,我有1個計數器從值2開始,一些非原子布爾變量和4個線程。 //Initialization (happens before any thread execute). std::atomic<int> count = ATOMIC_VAR_INIT(2); bool someBoolean = false; 線程1: count.fetch_sub(1, std::memory_or

    6熱度

    1回答

    下面我有兩個版本的自旋鎖。第一個使用默認的memory_order_cst,而後者使用memory_order_acquire/memory_order_release。由於後者更加寬鬆,我期望它有更好的表現。但似乎並非如此。 class SimpleSpinLock { public: inline SimpleSpinLock(): mFlag(ATOMIC_FLAG_INIT

    1熱度

    1回答

    我正在嘗試爲將在多個平臺上支持的應用程序使用Boost :: lockfree :: spsc_queue。我在Windows 7上使用各種版本的Visual Studio,從boost_1_55_0/libs/examples/lockfree中嘗試了spsc_queue.cpp示例,它們都正常工作。它在CentOS 6.3上運行得很好(在VMWare Player 6.0下運行)。但在Cent

    41熱度

    5回答

    說我有一個大型數組,我想用多個線程處理內容。如果我將每個線程委託給一個特定的部分,保證沒有重疊,是否消除了任何鎖定的需要,假設線程不訪問陣列之外的任何其他內存? 是這樣的(僞代碼): global array[9000000]; do_something(chunk) { for (i = chunk.start; i < chunk.end; i++) //do som

    1熱度

    2回答

    我試圖根據this發佈來擴展Java中的無鎖隊列的實現。 對於我的實現,我僅限於使用原子變量/引用。 另外,我的隊列應該有一個最大尺寸。 因此,putObject()應該在隊列滿時阻塞,如果隊列爲空,則應該阻塞getObject()。 目前我不知道如何解決這個問題,而不使用鎖。 例如,當使用AtomicInteger時,修改操作將是原子操作。 但是仍然存在一個問題,我必須處理putObject()

    0熱度

    1回答

    我寫了一個Java lock free queue實現。它有一個併發錯誤。我找不到它。這段代碼並不重要。我只是擔心我無法解釋與揮發性變量相關的觀察行爲。 該錯誤是由異常(「空頭」)可見的。這是不可能的狀態,因爲存在保持當前隊列大小的原子整數。隊列中有一個存根元素。它規定讀者線程不會改變尾部指針,並且編寫器線程不會改變頭部指針。 隊列長度變量保證鏈表永遠不會爲空。這是一個信號量。 take方法的行爲

    5熱度

    2回答

    我已經在C++ 11中使用新的std::atomic生成了一個無鎖(lockfree)隊列的簡單實現。我看不出我在這裏做錯了什麼。 #include <atomic> template<typename T> class lockless_queue { public: template<typename DataType> struct node {

    4熱度

    2回答

    我的理解是,如果存在大量爭用,鎖定空閒結構會更好,並且鎖定數據結構在低爭用情況下效果更好。 爲了測試,我寫了下面的代碼: #include<thread> #include<chrono> #include<iostream> #include<vector> #include<stack> #include<mutex> #include<fstream> #include <bo

    2熱度

    1回答

    在一些論壇和書籍(即 C++併發行動)還有多生產者/多消費者堆的一個很好的例子,在流行實現他們通常做到以下幾點: // head is an std::atomic<node*> variable node *old_head = head.load(); while(old_head && !head.compare_exchange_weak(old_head, old_head->ne