多線程信號量,互斥鎖,條件變量異同

多線程常見的幾種同步方式分爲以下幾點:
只是闡述相關性,具體代碼邏輯,網上一抓一大片,在此不在詳述。


1、信號量:

主要用於線程之間的數據同步,比如A線程數據處理完成之後會立馬通知B線程進行相應的操作。常見的信號有兩種一種是二進制信號,只有0和1兩種狀態,這種情況下類似於互斥鎖,另一種就是整型信號,在不爲0的情況下則可以獲取到信號,進行操作,每次操作完則進行信號減1,直到爲0的時候纔會處於阻塞。信號量在使用的時候,需要注意的是,要確保A線程與B線程直接的信號同步情況,比如A線程處理完成某一操作之後,通知到B線程,則B線程開始處理,如果A繼續進行處理,則此時的信號量一直將處於增長的狀態,而B線程無法感知此種情況,該種情況下組要使用兩個信號量,在B情況處理完成之後,通知A線程(信號量B),而A線程在處理完成之後也會通知B線程(信號量A),但是在初始化的時候,一般是把B信號初始化成1,在A線程優先使用,具體原因,可自己思考。信號量可以用在進程間或線程間(linux僅線程間的無名信號量pthread semaphore)進行通信,而互斥鎖主要是用在線程間



2、互斥鎖:

互斥鎖主要是在線程之間對於同一資源互斥使用時候的操作,主要用在互斥上,比如在A線程使用的時候,則B線程將會處於阻塞狀態下,只有在A線程釋放掉鎖之後,B線程才能使用鎖。注意跟信號量的區別,信號量是在A線程完成數據操作之後,會主動通知到B線程或者其他線程,而互斥鎖則不會進行通知,只有在其他線程使用到該全局變量的時候,纔會判斷是否處於加鎖的情況下,如果沒有則加鎖,如果有則處於阻塞模式。互斥鎖必須總是由給他上鎖的線程解鎖(因爲此時其他線程根本得不到此鎖),信號量沒有這種限制:一個線程等待某個信號量,而另一個線程可以掛出該信號量



3、條件變量:

條件變量類似於信號量,一旦條件“成熟”則進行處理,條件變量能使線程處於wait狀態,另一個線程在滿足條件的時候發signal,然後所有處於wait的線程依次得到喚醒,條件變量通過線程阻塞和可以給另一個線程發送signal喚醒線程的優厚條件彌補了互斥鎖只有加鎖和解鎖的這兩種情況,在一般情況下,條件變量和互斥鎖是聯合使用的,在條件成熟的情況下,加鎖,處理數據,釋放鎖,再次等待條件成熟。它是發送信號與等待信號。互斥鎖用戶上鎖,條件變量則用於等待。一般來說,在一個進程/線程中調用pthread_cond_wait(..)等待某個條件的成立,此時該進程阻塞在這裏,另外一個進程/線程進行某種操作,當某種條件成立時,調用pthread_cond_signal(...)來發送信號,從而使pthread_cond_wait(...)返回。此處要注意的是,這裏所談到的信號,不是系統級別的SIGXXXX信號,只是用信號這個詞語更容易理解。條件變量與信號量更接近或者就可以認爲是信號量。pthread_cond_wait函數也可以用一個while死循環來等待條件的成立,但要注意的是,使用while死循環會嚴重消耗CPU,而pthread_cond_wait則是採用線程睡眠的方式,它是一種等待模式,而不是一直的檢查模式。每個信號量有一個與之關聯的值,掛出時+1,等待時-1,那麼任何線程都可以掛出一個信號,即使沒有線程在等待該信號量的值。不過對於條件變量來說,如果pthread_cond_signal之後沒有任何線程阻塞在pthread_cond_wait上,那麼此條件變量上的信號丟失。

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