多線程多併發情況下的互斥有哪些方法

多線程併發之間有多種鎖的模式,適應於不同的應用場景。鎖的模式有些地方也叫線程之間的同步方式。所謂的同步就是多個線程之間進行數據一致性需要用到的機制。

一、互斥鎖mutex(pthread_mutex_t)
pthread_mutex_t,讀寫都獨佔的模式。最常用的模式,也就是編碼中最喜歡用的。。。。
1.1、一旦一個線程拿到鎖,另一個線程需要阻塞等待前一個線程釋放鎖才能拿到這個鎖。
1.2、爲了不讓線程阻塞,則可以調用trylock的接口,通過返回值來判斷是否加鎖成功。
1.3、但是這個鎖有個問題就是線程之間不能併發,只能串行進行,爲此係統又提供了一個可以支持讀併發的鎖。pthread_rwlock_t 讀寫鎖

1、pthread_mutex_t lock;
2、pthread_mutex_init(&lock)
3、pthread_mutex_lock(&lock);
4、pthread_mutext_unlock(&lock);

二、讀寫鎖(pthread_rwlock_t)
在讀的模式下,可以多個線程同時獲取到鎖,以至於可以做到多個讀線程併發的目的,但是對於寫操作,還是串行的。同時讀和寫之間也只能互斥。同時如果一旦這個讀寫鎖已經被線程A鎖住,後後面因爲另一個線程B需要加寫鎖,那麼需要阻塞等待,此時在一個線程C需要加讀鎖,此時也會組撒,但是一旦A釋放鎖,那麼線程B的佔用的鎖的優先級會更高,因爲寫鎖的優先級比讀鎖的優先級高。

1、pthread_rwlock_t lock;
2、pthread_rwlock_init(&lock)
3、pthread_rdlock(&lock);
4、pthread_wrlock(&lock);

三、條件變量(pthread_cond_t)
前面說的互斥量和讀寫鎖,只能保證多個線程互斥訪問共享資源,但是不能阻塞等待某個條件滿足後繼續執行線程的動作。比如這樣的場景:一個線程需要從一個鏈表中取數據來處理,但是這個鏈表在某些時候爲空,那麼則這個線程需要等待(pthread_cond_wait)這個鏈表有數據後,在繼續執行。這歌場景在mutex和讀寫鎖鎖是搞不定的,因此這樣的場景就需要條件變量來解決。條件變量不是鎖,不會鎖共享資源但是可以組賽線程等到某個條件滿足後,繼續執行。這就是條件變量的原理。

1、pthread_cond_t cond;
2、pthread_cond_init(&cond);
3、pthread_cond_wait(&cond);
4、pthread_cond_signal(&cond);通知

條件變量不是鎖,只是阻塞線程的作用,要做到鎖的效果,需要結合互斥鎖。

四、信號量(sem_t sem)
互斥鎖只能保證線程間串行處理,不能並行處理,要並行的話則需要使用讀寫鎖。但是讀寫鎖適用於了讀多寫少的場景。因此在Linux中有一種機制信號量可以讓多個線程並行訪問共享資源。當然信號量是鎖(sem_t sem).其實信號量主要是處理多併發限制的場景,也就是併發數量不能超過多少的場景。

注意信號量也可以作爲進程間同步的方式;此時sem_init(&sem, share, 100)中share=1表示進程間同步

1、sem_t sem;
2、sem_init(&sem, 0, 100)//初始化併發數目 100(value),也就是可以支持100個線程進程共享訪問共享資源。
3、sem_wait(&sem);調用一次wait就相當於對value值減1
4、sem_post(&sem);調用一次pst相當於對value++;

使用信號量做生產者和消費者模型
在這裏插入圖片描述

總結:其實信號量就是對value值進行操作,而mutex值其實就是value=2的信號量。這樣只能做到兩個線程之間互斥。而條件變量則是阻塞線程,不啓互斥作用。讀寫鎖是處理讀多寫少的場景,起到讀寫互斥,讀讀併發不互斥的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章