簡體   English   中英

原子變量還需要鎖定讀取-修改-存儲操作嗎?

[英]atomic variable also require lock on read-modify-store operation?

我知道原子變量是無鎖的!!
它不會鎖定線程,但我有一個問題..
像 std::atomic::fetch_add 這樣的 Read-Modify-Store 操作也是原子執行的???
我認為這個操作不僅僅是一個指令。
它需要多個周期......所以如果我不鎖定 memory 總線(實際上我不知道互斥鎖是否包含 memory 總線鎖定),其他線程可以在讀取和存儲操作之間進行 memory 操作。
所以我認為即使原子變量也需要鎖定......

我是不是很清楚???

You konwing 就在早期的 x86 架構中。

在 x86 架構中,提供了指令前綴 LOCK。原子變量依賴於該指令。早期的 LOCK 是通過鎖定總線來實現的,以防止 memory 從其他 CPU 內核訪問。 可以想象,這種實現效率非常低

大多數x86處理器都支持CAS的硬件實現,保證了多處理器多核系統中原子操作的正確性。 CAS 的實現也不會鎖定總線,只會阻止其他 CPU 對檢查相關 memory 的緩存塊的訪問。 讓你看看代碼。 示例代碼是:

#include <iostream>
#include <thread>
#include <atomic>
 
std::atomic<long long> data;
void do_work()
{
    data.fetch_add(1, std::memory_order_relaxed);
}
 
int main()
{
    std::thread th1(do_work);
    std::thread th2(do_work);
    std::thread th3(do_work);
    std::thread th4(do_work);
    std::thread th5(do_work);
 
    th1.join();
    th2.join();
    th3.join();
    th4.join();
    th5.join();
 
    std::cout << "Result:" << data << '\n';
}

將上述代碼轉換為指令。 在 gcc 8 do_work function 翻譯成

        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], 1
        mov     DWORD PTR [rbp-12], 0
        mov     rax, QWORD PTR [rbp-8]
        mov     edx, OFFSET FLAT:data
        lock xadd       QWORD PTR [rdx], rax
        nop
        pop     rbp
        ret

使用lock xadd來確保原子操作符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM