c语言用户态锁使用,用户态自旋锁、读写自旋锁及互斥锁
1、自旋鎖
自旋鎖最多可能被一個可執行線程所持有。一個被征用的自旋鎖使得請求它的線程在等待鎖重新可用時自旋(特別浪費處理器時間)。所以自旋鎖不應該被長時間持有。
自旋鎖是不可遞歸的!
(1)自旋鎖相關函數
用戶態的自旋鎖相關函數包含在頭文件中。
相關函數:
int pthread_spin_destroy(pthread_spinlock_t *lock);
銷毀自旋鎖lock,并且回收被鎖lock使用的任何資源。
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
分配使用自旋鎖lock所需要的資源,并且初始化鎖lock為未鎖狀態。
int pthread_spin_lock(pthread_spinlock_t *lock);
鎖住自旋鎖lock。當鎖沒有被某個線程持有時,調用的線程將獲得鎖,否則線程將不斷自旋,知道鎖可用。
int pthread_spin_trylock(pthread_spinlock_t *lock);
如果鎖沒有被某個線程持有,自旋鎖lock將被鎖住,否則將會失敗。
int pthread_spin_unlock(pthread_spinlock_t *lock);
釋放被鎖住的自旋鎖lock。
(2)基本使用形式
pthread_spin_init(&lock, 0);
…
pthread_spin_lock(&lock);
/*臨界區資源…*/
pthread_spin_unlock(&lock);
pthread_spin_destroy(&lock);
真正需要保護的是數據而不是代碼,采用特定的鎖保護自己的共享數據。
2、讀-寫自旋鎖
有時,鎖的用途可以明確分為讀取和寫入兩個場景。對一個鏈表可能既要更新又要檢索。當更新(寫入)連寶石,不能有其他代碼并發地寫或者讀鏈表,寫操作要求完全的護持。另一方面,當對其檢索(讀取)鏈表時,只要求其他程序不對鏈表進行寫操作就行了,可以有多個并發的讀操作。類似于這種情況,就可以通過讀-寫鎖進型保護。
這種鎖的機制照顧寫要多一點,因此,非常適用于讀操作遠多于寫操作的場景,能提高效率。
(1)讀-寫鎖相關函數
用戶態的讀-寫鎖相關函數包含在頭文件中。
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);//加寫鎖
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);//解鎖
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);//銷毀鎖
讀-寫自旋鎖的基本使用形式跟自旋鎖差不多。
3、互斥鎖
互斥鎖說白了就是一種互斥的排他鎖-——好比允許睡眠的自旋鎖。
(1)互斥鎖相關的函數
用戶態的互斥鎖相關函數包含在頭文件中。
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);//加鎖
/*臨界區…*/
pthread_mutex_unlock(&mutex);//解鎖
自旋鎖與互斥鎖使用對比
需求
建議的加鎖方法
低開銷加鎖
優先使用自旋鎖
短期鎖定
優先使用自旋鎖
長期加鎖
優先使用互斥鎖
持有鎖需要睡眠
使用互斥鎖
總結
以上是生活随笔為你收集整理的c语言用户态锁使用,用户态自旋锁、读写自旋锁及互斥锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中三个数比较大小详解——三种方法
- 下一篇: 自旋锁原理分析