1.i++分為三個階段:
記憶體到暫存器
暫存器自增
寫回記憶體
這三個階段中間都可以被中斷分離開.
2.++i首先要看編譯器是怎麼編譯的,
某些編譯器比如vc在非優化版本中會編譯為以下彙編**:
__asm
這種情況下,必定不是原子操作,不加鎖互斥是不行的。
假設加了優化引數,那麼是否一定會編譯為「inc dword ptr[i]」呢?答案是否定的,這要看編譯器心情,如果++i的結果還要被使用的話,那麼一定不會被編譯為「inc dword ptr[i]」的形式。
那麼假設如果編譯成了「inc dword ptr[i]」,這是原子操作,是否就不需要加鎖了呢?如果在單核機器上,不加鎖不會有問題,但到了多核機器上,這個不加鎖同樣會帶來嚴重後果,兩個cpu可以同時執行inc指令,但是兩個執行以後,卻可能出現只自加了一次。
真正可以確保不「額外」加鎖的彙編指令是「lock inc dword ptr[i]」,lock字首可以暫時鎖住匯流排,這時候其他cpu是無法訪問相應資料的。但是目前沒有任何乙個編譯器會將++int編譯為這種形式。
i 是否原子操作?並解釋為什麼?
1 原子操作是不可分割的,在執行完畢之前不會被任何其它任務或事件中斷。2 不是原子操作。理由 1.i 分為三個階段 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開.2.i首先要看編譯器是怎麼編譯的,某些編譯器比如vc在非優化版本中會編譯為以下彙編 asm 這種情況下,必定不...
面試題 1 i 是否原子操作?並解釋為什麼?
不是原子操作。理由 1.i 分為三個階段 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開.2.i首先要看編譯器是怎麼編譯的,某些編譯器比如vc在非優化版本中會編譯為以下彙編 asm 這種情況下,必定不是原子操作,不加鎖互斥是不行的。假設加了優化引數,那麼是否一定會編譯為 i...
i 和 i 是否為原子操作?
2021年02月22日 周一 天氣晴 不悲嘆過去,不荒廢現在,不懼怕未來 參考文獻 原子操作是不可分割的,在執行完畢前不會被任何其它任務或事件中斷 在單執行緒中,能夠在單條指令中完成的操作都可以認為是 原子操作,不能在單條指令中完成的操作也都可以認為不是原子操作,因為中斷可以且只能發生於指令之間 在...