11 23 原子操作

2021-06-27 05:09:29 字數 1667 閱讀 6541

為了編譯android src, 把gcc 版本版本降到4.3 後來學習核心模組 原子操作,寫了乙個測試模組,可以順利make,有個warning:mcount  undefined....接著又測試下之前寫好的模組,也出現了相同的錯誤..在網上找了好久,沒有發現此問題的解決辦法,仔細回憶機器環境的變化就是gcc 版本出錯了,改回去,立馬編譯ok

一 gcc 版本切換 

1)/usr/bin/gcc 更改軟連線

2)使用工具update-alternatives

增加兩個選項(最後乙個值優先順序,用於自動模式選擇)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40

sudo update-alternatives --config gcc  輸入序號選擇.

二 核心原子操作

原子操作就是在執行過程中不能被中斷的操作,即一般時一系列操作,要麼全做要麼不做.

在併發處理過程中 ,常規看到的操作例如 int i=2; i+=3;這種簡單的賦值語句,看似原子操作,其實質並非原子操作,他們都是又多條彙編**完成..可以使用objdump -d 檢視.

原子操作基本有三種型別: 整型原子操作,64位整型原子操作,位原子操作

整型原子操作定義在

typedef structatomic_t;

整型原子操作主要用於計數.例如檔案開啟次數.

主要使用的巨集和函式

atomic_init(int i);

int atomic_read(atomic_t *v);

void atomic_set(atomic *v,int i);

int atomic_dec_and_test(atomic *v);  //減1測試是否為0

int atomic_inc_and_test(atomic *v); 

.....   //其實操作在標頭檔案檢視

64位整型原子操作

相容64位cpu和os

typedef structatomic64_t;

位原子操作

主要進行位操作,指定位置0或置1

unsigned long value=0;

set_bit(0,&value);

clear_bit(1,&value);

chang_bit(int nr,void *addr) ;//取反

用原子操作阻止裝置檔案被多個程序開啟.

static int atomic_test_open(struct inode *node,struct file *file)

} return 0;

}static int atomic_test_release(struct inode *inode,struct file *file)

return 0;

}

module_param(atom,int,s_irugo|s_iwusr);  //引數名稱,型別,許可權  

在insmod 時 傳入引數 例如 insmod atomic_test.ko atom=0

原子性,原子操作

舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...

原子變數與原子操作

1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...

c 原子操作 賦值 c 原子操作

這個型別可以在兩個狀態間切換 設定set flag true 和清除clear flag false 必須被atomic flag init初始化此時flag為clear狀態,初始化標準為是清除狀態。當你的標誌物件已初始化,那麼你只能做三件事情 銷毀,清除或設定 查詢之前的值 這些事情對應的函式分別...