1. 程式人生 > >原子操作詳解

原子操作詳解

原子操作

原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開始,就一直執行到結束,中間不會被其他程序打斷。它是其他核心同步方法的基石。編寫程式碼時能使用原子操作的,就儘量不要用加鎖機制,因為原子操作給系統帶來的開銷小。

 

一、原子整數操作

 

1、型別的定義

     針對整數的原子操作只能對atomic_t型別的資料進行處理

typedef struct {
    volatile int counter;
}atomic_t;

    定義一個atomic_t型別的方式如下

atomic_t v;							//定義v
Atomic_t u = ATOMIC_INIT(0);		//定義u並且初始化位0
  1. 常用操作函式
  2. atomic_set(&v,4);					//設定v=4
    atomic_add(&v,4);					//設定v = v + 2 = 6 (增加指定數值)
    atomic_inc(&v,4);					//設定v = v + 1 = 7(自增)
    atomic_dec_and_test(&v);			//測試自減之後是否為0,為零返回true

    原子性與順序性的比較

在大部分的體系結構上,讀取一個字本身就是一種原子操作,也就是說,在對一個字寫入期間不可能同時完成讀操作。所謂原子性就是這個道理:一個字長的讀取總是原子性的發生,絕不可能對同一個字交錯的進行寫。即讀操作要麼在寫之前完成沒要麼在寫之後完成。

例:對一個整數初始化為32,然後又賦值為365,那麼讀取這個整數肯定是32或者是365,不可能是其他資料。

程式碼中更多強調的是順序要求,即要求讀必須在寫之後發生,這種需求屬於順序要求。原子性確保指令執行期間不會被打斷,要麼執行完,要麼根本不執行,順序性確保兩條指令必須按照約定好的順序執行,不管處在什麼環境下