Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
Atitit。Cas機制?軟件開發?編程語言?無鎖機制?java?c#?php
?
1.?為什么需要無鎖操作1
2.?硬件支持?cas??atomic2
3.?無鎖編程(Lock-Free)就是在某些應用場景和領域下解決以上基于鎖機制的并發編程的一種方案。3
4.?Volatile??內存屏障(Memory?Barriers),就是它讓一個處理器內的內存狀態對其他處理器可見。 3
5.?參考3
?
?
1.?為什么需要無鎖操作
?
在某些時刻,你給這個變量賦一個64位的值。
?
| 1 2 3 4 | void?storeValue() { ?????sharedValue?=?0x100000002; } |
?
當你在32位的x86環境下使用GCC來編譯這個函數時,將會生成如下機器碼。
?
| 1 2 3 4 5 6 7 | $?gcc?-O2?-S?-masm=intel?test.c $?cat?test.s ??????... ??????mov?DWORD?PTR?sharedValue,?2 ??????mov?DWORD?PTR?sharedValue+4,?1 ??????ret ??????... |
?
這個時候你就會看到,編譯器會使用兩個單獨的機器指令來完成這個64位的賦值。第一條指令設置低32位的0×00000002,第二條指令設置高32位的0×00000001.非常明顯,這個賦值操作是非原子的。如果共享變量同時被不同的線程存取,就會出現很多錯誤:
作者::??★(attilax)>>>?綽號:老哇的爪子?(?全名::Attilax?Akbar?Al?Rapanui?阿提拉克斯?阿克巴?阿爾?拉帕努伊?)?漢字名:艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://www.cnblogs.com/attilax/
?
同時讀取sharedValue會帶給它一系列的問題:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 | uint64_t?loadValue() { ??????return?sharedValue; } ? $?gcc?-O2?-S?-masm=intel?test.c $?cat?test.s ??????... ??????mov?eax,?DWORD?PTR?sharedValue ??????mov?edx,?DWORD?PTR?sharedValue+4 ??????ret ??????... |
?
這里也一樣,編譯器會使用兩條機器指令來執行這個加載操作:第一條讀取低32位到eax,第二條讀取高32位到edx。在這種情況下,如果對于sharedValue進行同時存儲則會發現,它將導致一個讀撕裂——即使這個同時存儲是原子的。
?
眾所周知,在x86環境下,如果內存操作數是自然對齊的,那么一個32位的mov指令就是原子的,但如果不是自然對齊,那么將是非原子的。換句話說,原子性的保證僅僅是當一個32位整數的地址正好是4的倍數的時候。
2.?硬件支持?cas??atomic
原子性不可能由軟件單獨保證--必須需要硬件的支持,因此是和架構相關的。在x86?平臺上,CPU提供了在指令執行期間對總線加鎖的手段。CPU芯片上有一條引線#HLOCK?pin,如果匯編語言的程序中在一條指令前面加上前綴"LOCK",經過匯編以后的機器代碼就使CPU在執行這條指令的時候把#HLOCK?pin的電位拉低,持續到這條指令結束時放開,從而把總線鎖住,這樣同一總線上別的CPU就暫時不能通過總線訪問內存了,保證了這條指令在多處理器環境中的原子性。
?
軟件級的原子操作,包括兩大類系統調用,一類是基于對整數進行操作的atomic_set/and/inc,一類是針對單獨的位進行操作的set/clear/change_bit,它們大部分都是基于硬件層面的CAS的指令實現的。
?
各種開發語言中(c,c++,java)基于操作系統提供的接口也都封裝實現了對應的原子操作api,所以開發者完全可以直接調用各個開發語言提供的接口實現無鎖程序。
3.?無鎖編程(Lock-Free)就是在某些應用場景和領域下解決以上基于鎖機制的并發編程的一種方案。
?
4.?Volatile??內存屏障(Memory?Barriers),就是它讓一個處理器內的內存狀態對其他處理器可見。
?
volatile
用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最的值。volatile很容易被誤用,用來進行原子性操作
?
5.?參考
原子操作?vs?非原子操作?-?博客?-?伯樂在線.htm
內存屏障(Memory?Barriers)?-?博客?-?伯樂在線.htm
【原創】無鎖編程技術及實現-黑夜路人-微頭條(wtoutiao.com).htm
java中volatile關鍵字的含義?-?God?Is?Coder?-?博客園.htm
?
總結
以上是生活随笔為你收集整理的Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.6.26 编译安装
- 下一篇: C# 延时小函数 很好用