[code]typedef struct { volatile int counter; } atomic_t;使用
[code]定義 atomic_t v; atomic_t u=ATOMIC_INIT(0);//定義並初始化 atomic_set(&v,4); atomic_add(2,&v); atomic_inc(&v); /*將給定的原子變量減1,如果結果為0,就返回真,否則返回假*/ int atomic_dec_and_test(atomic_t *v);還有其他原子操作,看見文件
方式1:
[code] spinlock_t spinlock = SPIN_LOCK_UNLOCKED;方式2:
[code]spinlock_t spinlock ; spin_lock_init(spinlock )方式3:
[code]DEFINE_SPINLOCK(mr_lock)使用
[code]spin_lock(&mr_lock,flags); /*臨界區*/ spin_unlock(&mr_lock,flags);自旋鎖可以使用在中斷處理函數中,在中斷處理中使用自旋鎖時一定要注意:在獲取鎖之前首先禁止本地中斷(在當前處理器上的中斷請求),否則,中斷處理程序就會打斷正持有的內核代碼,有可能會試圖去征用這個已經被持有的自旋鎖,這樣一來,中斷處理程序就會自旋,等待該鎖重新可用,但是鎖的持有者在這個中斷處理程序執行完畢前不能能運行,造成雙重請求死鎖;
[code]unsigned long long flags; spin_lock_irqsave(&mr_lock,flags); /*臨界區*/ spin_unlock_irqrestore(&mr_lock,flags);spin_lock_irqsave()保存中斷的當前狀態,並禁止本地中斷,然後再去獲取執行的鎖,spin_unlock_irqrestore()對指定的鎖解鎖,讓中斷恢復到加鎖之前的狀態。
其他使用方法可以參考內核源碼