i++的線程安全性

來自:http://blog.csdn.net/sapair/article/details/4243974

i++的線程安全性可以總結如下:

(1)如果i是局部變量,那麼是可重入的,也就是線程安全的。

(2)如果i是全局變量,則同一進程的不同線程都可能訪問到該變量,因而是線程不安全的。

 

上面這兩點比較清晰,具體原因我將在下面解釋:

本質上來講,i並不是因爲是全局變量才說是線程不安全的。其實其本質原因是i++這個操作並不是原子的,如果這是原子操作的話,具有不可分特性,那麼即便是所有線程都能訪問到,也都是線程安全的。

i++最終被編譯後的反彙編代碼大概如下:

mov eax,【xxxxxxxx】

inc   eax

一條c語句已經被分爲兩條操作指令,那麼在這兩條操作指令執行之間,可能由於中斷而被調度到不同線程,於是,不安全性就產生了。當然了,這並不是說單條彙編語句就是線程安全的,這取決於CPU架構,因爲單條彙編指令可能在多個CPU時鐘週期內進行,有些CPU架構可以在任何一個時鐘週期內響應中斷,對於這樣的CPU,就是單條指令都不是安全的。當然了,現在的CPU大部分都是一條指令執行完後才能響應中斷的。想要進行原子操作,方法有很多種,其中一種比較簡單的是在原子語句之間先關閉中斷,然後進行原子操作後再打開中斷就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章