c语言用户态锁使用,用户态自旋锁、读写自旋锁及互斥锁
1、自旋鎖
自旋鎖最多可能被一個(gè)可執(zhí)行線程所持有。一個(gè)被征用的自旋鎖使得請(qǐng)求它的線程在等待鎖重新可用時(shí)自旋(特別浪費(fèi)處理器時(shí)間)。所以自旋鎖不應(yīng)該被長(zhǎng)時(shí)間持有。
自旋鎖是不可遞歸的!
(1)自旋鎖相關(guān)函數(shù)
用戶態(tài)的自旋鎖相關(guān)函數(shù)包含在頭文件中。
相關(guān)函數(shù):
int pthread_spin_destroy(pthread_spinlock_t *lock);
銷毀自旋鎖lock,并且回收被鎖lock使用的任何資源。
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
分配使用自旋鎖lock所需要的資源,并且初始化鎖lock為未鎖狀態(tài)。
int pthread_spin_lock(pthread_spinlock_t *lock);
鎖住自旋鎖lock。當(dāng)鎖沒(méi)有被某個(gè)線程持有時(shí),調(diào)用的線程將獲得鎖,否則線程將不斷自旋,知道鎖可用。
int pthread_spin_trylock(pthread_spinlock_t *lock);
如果鎖沒(méi)有被某個(gè)線程持有,自旋鎖lock將被鎖住,否則將會(huì)失敗。
int pthread_spin_unlock(pthread_spinlock_t *lock);
釋放被鎖住的自旋鎖lock。
(2)基本使用形式
pthread_spin_init(&lock, 0);
…
pthread_spin_lock(&lock);
/*臨界區(qū)資源…*/
pthread_spin_unlock(&lock);
pthread_spin_destroy(&lock);
真正需要保護(hù)的是數(shù)據(jù)而不是代碼,采用特定的鎖保護(hù)自己的共享數(shù)據(jù)。
2、讀-寫(xiě)自旋鎖
有時(shí),鎖的用途可以明確分為讀取和寫(xiě)入兩個(gè)場(chǎng)景。對(duì)一個(gè)鏈表可能既要更新又要檢索。當(dāng)更新(寫(xiě)入)連寶石,不能有其他代碼并發(fā)地寫(xiě)或者讀鏈表,寫(xiě)操作要求完全的護(hù)持。另一方面,當(dāng)對(duì)其檢索(讀取)鏈表時(shí),只要求其他程序不對(duì)鏈表進(jìn)行寫(xiě)操作就行了,可以有多個(gè)并發(fā)的讀操作。類似于這種情況,就可以通過(guò)讀-寫(xiě)鎖進(jìn)型保護(hù)。
這種鎖的機(jī)制照顧寫(xiě)要多一點(diǎn),因此,非常適用于讀操作遠(yuǎn)多于寫(xiě)操作的場(chǎng)景,能提高效率。
(1)讀-寫(xiě)鎖相關(guān)函數(shù)
用戶態(tài)的讀-寫(xiě)鎖相關(guān)函數(shù)包含在頭文件中。
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
constpthread_rwlockattr_t *restrict attr);//初始化鎖
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//加讀鎖
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//加寫(xiě)鎖
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);//解鎖
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);//銷毀鎖
讀-寫(xiě)自旋鎖的基本使用形式跟自旋鎖差不多。
3、互斥鎖
互斥鎖說(shuō)白了就是一種互斥的排他鎖-——好比允許睡眠的自旋鎖。
(1)互斥鎖相關(guān)的函數(shù)
用戶態(tài)的互斥鎖相關(guān)函數(shù)包含在頭文件中。
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
constpthread_mutexattr_t *restrict attr);//初始化鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);//加鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);//解鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);//銷毀鎖
(2)基本使用形式
pthread_mutex_init(&mutex);
pthread_mutex_lock(&mutex);//加鎖
/*臨界區(qū)…*/
pthread_mutex_unlock(&mutex);//解鎖
自旋鎖與互斥鎖使用對(duì)比
需求
建議的加鎖方法
低開(kāi)銷加鎖
優(yōu)先使用自旋鎖
短期鎖定
優(yōu)先使用自旋鎖
長(zhǎng)期加鎖
優(yōu)先使用互斥鎖
持有鎖需要睡眠
使用互斥鎖
總結(jié)
以上是生活随笔為你收集整理的c语言用户态锁使用,用户态自旋锁、读写自旋锁及互斥锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言中三个数比较大小详解——三种方法
- 下一篇: hach vue 跳转_Vue路由实现、