日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php

發布時間:2025/3/17 C# 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

javavolatile關鍵字的含義?-?God?Is?Coder?-?博客園.htm

?

總結

以上是生活随笔為你收集整理的Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。