[英]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.