多核CPU的多個核可以同時訪問記憶體嗎?
阿新 • • 發佈:2018-12-26
轉自:https://bbs.csdn.net/topics/390531464
目前的x86/x64的多核/多處理器系統是SMP結構,共享主存,記憶體是共享裝置,多個處理器/核心要訪問記憶體,首先要獲得記憶體匯流排的控制權,任何時刻只有一個處理器/核心能獲得記憶體匯流排的控制權,所以單就記憶體來說,不會出現多個處理器/核心同時訪問一個記憶體地址的情況。但是每個處理器/核心可能有自己的cache(非共享的),所以,如果某個記憶體地址的資料在多個處理器/核心的cache中都存在的話,是可能出現併發讀的情況,對於讀寫,或者寫寫的併發操作,處理器實現的cache一致性協議可以保證物理上不會出現真正的併發操作。
所以對於你在多執行緒中訪問的整數,理論上是可以不加鎖訪問的,但是你必須保證訪問它的操作是原子的,這就與你的使用方式和編譯器生成的程式碼有關。
簡單賦值是沒有問題的,比如i = 1; 但是涉及到其他變數的複合賦值就不能保證了,比如i = j; i = j + 1;
自增/自減操作,象i++、i--、i = i + 1;i = i - 1;等等,與編譯器生成的程式碼有關,如果使用inc/dec指令,是沒有問題的,如果使用mov、add/sub、mov指令序列,則不能保證操作的原子性。
比較操作,除非顯式使用cmpxchg指令,否則不能保證操作的原子性。
所以,如果你的多執行緒共享資料是隻讀的,或者多讀一寫模型,那麼你可以不用加鎖訪問,否則你最好還是要加鎖。