多執行緒間的幾種鎖

2021-10-11 23:17:33 字數 3367 閱讀 7925

1、互斥量(互斥鎖)

2、讀寫鎖(共享互斥鎖)

3、自旋鎖

4、條件變數

5、屏障

#include// 初始化互斥量

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

// 銷毀互斥量

int pthread_mutex_destroy(pthread_mutex_t *mutex);

// 加鎖(執行緒可能會阻塞)

int pthread_mutex_lock(pthread_mutex_t *mutex);

// 嘗試加鎖(執行緒不會被阻塞)

int pthread_mutex_trylock(pthread_mutex_t *mutex);

// 解鎖

int pthread_mutex_unlock(pthread_mutex_t *mutex);

讀寫鎖可以有三種狀態:讀模式下加鎖、寫模式加鎖、不加鎖狀態。一次可以只有乙個執行緒占有讀寫鎖的寫模式,但是多個執行緒可以同時占用讀模式的讀寫鎖。當讀寫鎖是寫加鎖狀態時,在這個鎖解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是任何希望以寫模式對此鎖進行加鎖的執行緒都會阻塞,直到所有的執行緒釋放他們的寫鎖為止。讀寫鎖適用於對資料的讀遠大於寫的情況。

#include // 初始化讀寫鎖

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

// 銷毀讀寫鎖

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

// 讀模式加鎖(阻塞模式)

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

// 讀模式加鎖(非阻塞模式)

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

// 寫模式加鎖(阻塞模式)

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

// 寫模式加鎖(非阻塞模式)

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

// 解鎖

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

自旋鎖和互斥量類似,忙等(自旋)阻塞,而不是休眠阻塞。自旋鎖適用於持有的時間端,而且執行緒並不希望在重新排程上花費太多的成本。多用於核心態,使用者態用的比較少。

#include // 初始化自旋鎖

int pthread_spin_init(pthread_spinlock_t *lock);

// 銷毀自旋鎖

int pthread_spin_destroy(pthread_spinlock_t *lock);

// 加鎖(阻塞模式)

int pthread_spin_lock(pthread_spinlock_t *lock);

// 加鎖(非阻塞模式)

int pthread_spin_trylock(pthread_spinlock_t *lock);

// 解鎖

int pthread_spin_unlock(pthread_spinlock_t *lock);

條件變數是執行緒可用的另外乙個同步機制,條件變數和互斥量一起使用,允許執行緒以無競爭的方式等待特定條件的發生,主要用於執行緒池之中。條件本身是由互斥量保護的,執行緒在改變條件之前必須首先鎖住互斥量。

注意:針對pthread_cond_wait()這個函式,呼叫者把鎖住的互斥量傳給函式,函式自動把呼叫執行緒放到等待條件發生的執行緒列表上,對互斥量解鎖。當pthread_cond_wait()返回時,互斥量將再次被鎖住。

#include // 初始化條件變數

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

// 銷毀條件便來給你

int pthread_cond_destroy(pthread_cond_t cond);

// 等待條件發生(呼叫者把鎖住的互斥量傳遞給函式,函式把呼叫執行緒放在等待條件的執行緒列表上,對互斥來給你解鎖)

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

// 超時指定我們願意等待多長時間

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);

// 觸發等待在該條件上的某乙個執行緒

int pthread_cond_signal(pthread_cond_t cond);

// 觸發等待在該條件上的所有執行緒

int pthread_cond_broadcast(pthread_cond_t cond);

屏障是用於協調多個程序並行工作的同步機制,屏障允許每個執行緒等待,直到所有合作執行緒都到達某個點後,然後從該點繼續執行。

#include// 屏障初始化

int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_ty * restrict attr, unsigned int count);

// 屏障銷毀

int pthread_barrier_destroy(pthread_barrier_t *barrier);

// 執行緒阻塞到屏障,如果是呼叫該函式的最後乙個執行緒滿足屏障計數,則所有的執行緒都被喚醒

int pthread_barrier_wait(pthread_barrier_t *barrier);

多執行緒的幾種鎖

所有鎖的前提是 synchronized 條件下 重入鎖 執行緒1 執行方法a,方法a中執行方法b,則產生重入鎖,即不需要等待獲取鎖 中斷鎖 reentrantlock 使用synchronized修飾的方法,在阻塞狀態blocked時不能被外部打斷,除非jvm報錯.使用reentrantlock中...

多執行緒的鎖

由於併發的問題,需要加鎖 當多個執行緒同時進行任務時,為了保證不會有多個執行緒同時對同乙個資料進行操作造成不可預料的後果,所以有了鎖的概念,我們通過鎖來使多執行緒任務更加安全。lock threading.lock cond threading.condition lock lock 多執行緒的鎖例...

python多執行緒鎖 python的多執行緒程式設計之鎖

1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...