一.併發控制
(1)自旋鎖
得不到資源,會原地打轉,直到獲得資源為止
定義自旋鎖
spinlock_t spin;
初始化自旋鎖
spin_lock_init(lock);
獲得自旋鎖
spin_lock(lock);獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放
spin_trylock(lock);嘗試獲得自旋鎖,如果能立即獲得,它獲得並返回真,否則
立即返回假,實際上,不再「在原地打轉」
釋放自旋鎖
spin_unlock(lock);與spin_trylock或者spin_lock配對使用
使用方法:
spinlock_t lock;
spin_lock_init(&lock);
spin_lock(&lock);//獲取自旋鎖,保護臨界區
...//臨界區
spin_unlock(&lock);//解鎖
eg:使用自旋鎖使裝置只能被乙個程序開啟
int ***_count=0;
static int ***_open(struct inode *inode, struct file *filp)
***_count++;
spin_unlock(&***_lock);
...return 0;
}
static int ***_release(struct inode *inode,struct file *filp)
(2)訊號量
得不到資源,會進入休眠狀態
定義訊號量
struct semaphore sem;
初始化訊號量
void sema_init(struct semaphore *sem,int val);初始化並設定為val
void init_mutex(struct semaphore *sem);初始化並設定為1
void init_mutex_locked(struct semaphore *sem);初始化並設定為0
下面兩個巨集用於定義並初始化訊號量的「快捷方式」
declare_mutex(name);初始化並設定為1
declare_mutex_locked(name);初始化並設定為0 獲得訊號量
void down(struct semaphore *sem);會導致休眠,不能在中斷上下文使用
int down_interruptible(struct semaphore *sem);不會導致休眠,可在中斷上下文使用
使用down_interruptible()獲得訊號量時,常對返回值進行檢查
if(down_interruptible(&sem))
釋放訊號量
void up(struct semaphore *sem);釋放訊號量sem,喚醒等待者
使用方法:
declare_mutex(mount_sem);
down(&mount_sem);獲取訊號量,保護臨界區
...critical section //臨界區
...up(&mount_sem);//釋放訊號量
eg:使用訊號量實現裝置只能被乙個程序開啟
static declare_mutex(***_lock);//定義互斥鎖
static int ***_open(struct inode *inode,struct file *filp)
static int ***_release(struct inode *inode,struct file *filp)
總結:在多cpu中需要自旋鎖來互斥,當程序占用資源時間較長,使用訊號量。當所要保護的臨界區訪問時間較短,用自旋鎖,它節省了上下文切換的時間。
訊號量所保護的臨界區可包含可能引起阻塞的**,自旋鎖不能包含。阻塞意味著進行程序的切換,如果程序被切換出去後,另乙個程序企圖獲取本自旋鎖,死鎖會發生。
訊號量存在程序上下文,如果被保護的共享資源需要在中斷或軟中斷情況下使用,只能使用自旋鎖,如果一定要使用訊號量,只能通過down_trylock()方式進行,不能獲取就立即返回避免阻塞。
自旋鎖會導致死迴圈,鎖定期間不允許阻塞,鎖定的臨界區要小。
(3)互斥體
訊號量已經可以實現互斥的功能,但是mutex還是在linux中真實存在
定義並初始化
struct mutex my_mutex;
mutex_init(&my_mutex);
獲取互斥體
void fastcall mutex_lock(struct mutex *lock);
int fastcall mutex_lock_interruptible(strutct mutex *lock);
int fastcall mutex_trylock(struct mutex *lock);
釋放互斥體
void fastcall mutex_unlock(struct mutex *lock);
使用方法
struct mutex my_mutex;
mutex_init(&my_mutex);
mutex_lock(&my_mutex);
...//臨界資源
mutex_unlock(&my_mutex);
執行緒同步和非同步區別 非同步機制
1 區別同步和非同步乙個程序啟動的多個不相干執行緒,它們相互之間關係為非同步。舉個簡單的例子 就是遊戲,遊戲會有影象和背景 這裡的影象和聲音就分別是不同的執行緒 影象一般是主線程 背景 是守護執行緒 守護執行緒就是主線程結束的時候守護執行緒也結束 像這樣的組合就是非同步執行緒 兩個執行緒之間沒什麼關...
Linux的同步和非同步
一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 html view plain copy spinlock t spin 初始化自旋鎖 html view plain copy spin lock init lock 獲得自旋鎖 html view plain cop...
同步非同步通訊和程式編寫中的同步非同步
如果應用程式在執行期間只需要乙個執行緒,請使用下面的方法,這些方法適用於同步操作模式。若要在執行過程中使用單獨的執行緒處理通訊,請使用下面的方法,這些方法適用於非同步操作模式。三 軟體層次的阻塞和非阻塞模式 1 阻塞模式 阻塞模式執行i o操作完成前會一直進行等待,不會將控制權交給程式,一般可以設定...