i 是原子操作嗎

2021-09-30 11:27:02 字數 961 閱讀 6828

什麼是原子操作?

所謂原子操作,就是"不可中斷的乙個或一系列操作" 。在確認乙個操作是原子的情況下,多執行緒環境裡面,我們可以避免僅僅為保護這個操作在外圍加上效能開銷昂貴的鎖。

那麼,gnu c中x++是原子操作嗎?請看下面一段**:

[cpp]view plain

copy

print?

#include 

#include 

static

intx;  

void

inc()  

void

foo(

void

)    

}  int

main(

intargc, 

char

*ar**)  

**輸出的x值是多少呢? 

在多執行緒程式設計環境中,對全域性變數的訪問是需要進行同步保護的,當然也可以借用原子操作,這樣程式執行結果才是確定的。所以現在的問題是x++是原子操作嗎?如果是,則上述**執行結果x=10。如果不是,則執行結果是不確定的,x值為 [5, 10]範圍中的某個值。x++應該是非原子操作,但我又不是很確定,所以只好看彙編**了。

inc:

pushl   %ebp

movl    %esp, %ebp

movl    x, %eax

addl    $1, %eax

movl    %eax, x

popl    %ebp

ret從上面的彙編**片段,顯然可以確定x++是非原子的,它由3條彙編指令組成。因此上面的x的值也就是不確定的了,它的最大值可能為10,最小值可能為5。這兩種情況分別發生在完全沒有同步(即序列)和完全競爭(即每次均同時讀取同樣的x值)的情況下,兩個極端情形,要得到這樣的結果,估計要看rp(開個玩笑,呵呵)。 

結論,gnu c中x++不是原子操作,所以特別提供了原子值型別atomic_t。

i 是原子操作嗎?

原子操作 是不可被中斷的 i 不是原子操作 分為3步 1 先從記憶體中把i取出來放到暫存器中 2 然後 3 然後再把i複製到記憶體中,這需要至少3步 1.什麼是作業系統的 原子操作 原子操作是不可分割的,在執行完畢不會被任何其它任務或事件中斷,分為兩種情況 兩種都應該滿足 1 在單執行緒中,能夠在單...

i 是不是原子操作

可能我們對i 或者 i的用法已經爛熟於心,但是有次去浦發面試,面試官問,i 是不是原子操作,當是問懵了,回來惡補一下 問這個問題,面試官是想考察你對記憶體的理解。首先,之所以要討論是不是原子操作,因為如果是原子操作的話,在多執行緒操作時,就不用為了保護這個操作而加上昂貴又耗費效能的鎖。在單核作業系統...

i 和 i 是否為原子操作?

2021年02月22日 周一 天氣晴 不悲嘆過去,不荒廢現在,不懼怕未來 參考文獻 原子操作是不可分割的,在執行完畢前不會被任何其它任務或事件中斷 在單執行緒中,能夠在單條指令中完成的操作都可以認為是 原子操作,不能在單條指令中完成的操作也都可以認為不是原子操作,因為中斷可以且只能發生於指令之間 在...