memory-order

    1熱度

    1回答

    在x86/x64上,非臨時存儲指令(如MOVNTI和MOVNTPS)會比「常規」存儲庫產生更弱的內存排序保證。我知道共享內存時必須使用圍欄(例如SFENCE),而這些內存將被寫入非時間跨線程。但是,線程本地內存是否需要fence指令?如果我通過MOVNTPS寫入某個位置,寫入是否保證在沒有任何fence指令的情況下對同一線程中的後續指令可見?

    2熱度

    1回答

    我有代碼將任務分派到要遠程處理的asio io_service對象。據我所知,代碼的行爲是正確的,但不幸的是,我不太瞭解內存排序,並且我不確定在檢查原子標記以確保最佳性能時應使用哪些內存順序。 //boost::asio::io_service; //^^ Declared outside this scope std::vector<std::atomic_bool> flags(num_o

    3熱度

    1回答

    請參見下面的代碼: std::mutex mutex; std::condition_variable cv; std::atomic<bool> terminate; // Worker thread routine void work() { while(!terminate) { { std::unique_lock<std::mutex> lg

    3熱度

    1回答

    std::atomic<int> unique_ids; void foo() { int i = unique_ids.fetch_add(1, std::memory_order_relaxed); std::cout<<i; } int main(int argc, char* argv[]) { std::vector<std::thread> t

    1熱度

    1回答

    #include <atomic> std::atomic<int> val{1}; const auto my_order = std::memory_order_relaxed; // const lvalue int main() { val.store(42, my_order); } 此代碼沒有相關性,但我注意到有關內存排序的奇怪事情。編譯器產生以下組件爲主

    3熱度

    1回答

    考慮一個 std::atomic<int> x(0); 讓我們假設我有一個函數執行以下操作: int x_old = x.fetch_add(1,std::memory_order_acq_rel); 基礎上description for acquire release memory ordering: memory_order_relaxed操作輕鬆:沒有同步或排序約束,只有原子性需要此

    0熱度

    1回答

    的GCC-內置原子操作: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html 我需要一個原子操作:的添加調度研究與CAS。這是一個有點像內置函數__atomic_compare_exchange_n海灣合作委員會,但不同的: 函數原型就像這樣:bool atomic_compare_add(int &ptr, int &

    1熱度

    1回答

    我目前正試圖改善自定義「僞」棧,這樣使用(完整代碼在這篇文章的末尾提供)的性能:定期 void test() { theStack.stackFrames[1] = StackFrame{ "someFunction", 30 }; // A theStack.stackTop.store(1, std::memory_order_seq_cst); // B

    1熱度

    2回答

    假設我有一個時間戳記計數器。 static uint32_t _Atomic timestamp = 0U; static inline uint32_t get_ts(void) { return atomic_fetch_add_explicit(×tamp, 1, memory_order_acquire); } 假設我有一些併發代碼,我想通過實驗測試和記錄內

    1熱度

    1回答

    我試圖在無鎖編程中找到我的腳。在閱讀了對內存排序語義的不同解釋後,我想澄清可能發生的重新排序。就我所知,指令可以由編譯器重新排序(由於程序編譯時的優化)和CPU(在運行時?)。 對於鬆弛語義cpp reference提供了以下示例: // Thread 1: r1 = y.load(memory_order_relaxed); // A x.store(r1, memory_order_rel