原子操作主要用於實現資源計數
linux中的基本原子操作
atomic_read
atomic_set
atomic_add
atomic_sub
atomic_cmpxchg
atomic_clear_mask
while(atomic_cmpxchg(&v, 1, 0) != 1)
;for(i = 0; i < 3; i++)
atomic_set(&v, 1);
atomic_cmpxchg()函式實現了乙個比較+交換的原子操作(原子就是說cpu要不就不做,要做就一定要做完某些操作才能幹別的事情,對應這裡就是比較和交換要一次過做完).atomic_cmpxchg()比較kgdb_active->count的值是否等用-1,如果是則把cpu的值賦給kgdb_active->count,否則不修改它的值,atomic_cmpxchg返回kgdb_active->count賦值前的值.
簡單的講,假設4個程序同時開始,1號成功進入, atomic_dec_and_test成功減1並通過檢測,跳出while迴圈,其他3個程序成功減1但數值已為負數,不通過test,迴圈知道1號程序完成時加1(atomic_inc)。
while(!atomic_dec_and_test(&v))
/*do something*/
atomic_inc(&v);
先來看一下頭檔案和函式(:
#include
int request_irq(unsigned
int irq, irq_handler_t handler,
unsigned
long irqflags, const
char *devname, void *dev_id)
irq:
中斷號 arch/arm/plat-s3c64xx/include/plat/irqs.h
handler:
中斷處理函式 irqreturn_t handler(int irq, void *dev_id);
irqreturn_t:
see include/linux/irqreturn.h
irqflags:
see line 21-59 in include/linux/interrupt.h
使用irqf_shared共享irq時, irqflags必須相同
如: request_irq(irq_eint(0), handler1,
irqf_trigger_falling | irqf_shared, "dev1", &dev1);
request_irq(irq_eint(0), handler2,
irqf_trigger_falling | irqf_shared, "dev2", &dev2);
devname:
裝置名, cat /proc/interrupts
dev_id:
發生中斷時將dev_id傳遞給handler函式,
irqflags含有irqf_shared時dev_id不能為null, 並且要保證唯一
dev_id一般採用當前裝置的結構體指標
1.中斷時不能睡眠,進入中斷時會遮蔽其他中斷,此時睡眠將無法接受用於喚醒的中斷,而自己處於睡眠,也無法喚醒自己。——所以使用自旋鎖,不進入睡眠。2.中斷可以設為共享讓其他『人』使用。
返回threadfn函式的返回值, 如果k沒有被wake_up_process(k)過將返回-eintr
不是強制停止, 如果核心執行緒不停止將一直等待
你可以直接拔出模組『殺死』乙個自己建立並插入的核心態執行緒(不使用通知),核心將會崩潰。
int kthread_should_stop(void);標頭檔案 linux/kthread.h
核心執行緒學習筆記總結2
include linux module.h include linux kernel.h include linux init.h include linux sched.h module author t bagwell cu module license gpl static declare ...
C 併發與多執行緒學習筆記(七)原子操作
先來設想乙個場景 存在乙個變數,有執行緒要讀這個變數,有執行緒要寫這個變數 int share value 0 void threadfunc intmain 按理說,我們用兩個執行緒各對這個變數加10萬次,加起來應該是20萬。我們來看看結果 再執行一次 可以看到,兩次結果都沒有20萬。計算結果因計...
Golang學習筆記 原子操作
簡介 型別 增或減add 比較並交換cas 載入load 儲存store 交換swap 原子值sync atomic.value 執行過程中不能被中斷的操作。在針對某個值的操作過程中,cpu絕不會再去執行其它針對該值的操作,無論這些其他操作是否是原子操作。對於不能被取位址的值是無法進行原子操作的。把...