歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核同步方法

Linux內核同步方法

日期:2017/3/3 12:57:36   编辑:Linux內核

原子操作

“原子”不可分割,原子操作,就是不能被分割的指令。 原子類型實際上是一個整數:

[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);
還有其他原子操作,看見文件

自旋鎖–spin lock

自旋:如果一個執行線程試圖獲得一個已經被持有的的自旋鎖,那麼該線程就會一直進行忙-旋轉-等待鎖重新可用。定義和初始化

方式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()對指定的鎖解鎖,讓中斷恢復到加鎖之前的狀態。

其他使用方法可以參考內核源碼

Copyright © Linux教程網 All Rights Reserved