學習筆記 原子位 核心執行緒

2021-08-02 22:02:35 字數 2387 閱讀 7740

原子操作主要用於實現資源計數

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絕不會再去執行其它針對該值的操作,無論這些其他操作是否是原子操作。對於不能被取位址的值是無法進行原子操作的。把...