執行緒之間的同步和互斥

2021-07-25 15:54:59 字數 1946 閱讀 2384

1.互斥鎖線程控制

互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。 

互斥鎖只有兩種狀態,也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全域性變數。 

在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖一

個已經被上鎖的互斥鎖,則該執行緒就會掛起,直到上鎖的執行緒釋放掉互斥鎖為止。

互斥鎖可以分為快速互斥鎖、遞迴互斥鎖和檢錯互斥鎖。

這三種鎖的區別主要在於其他未占有互斥鎖的執行緒在希望得到互斥鎖時是否需要阻塞等待。

快速鎖是指呼叫執行緒會阻塞直至擁有互斥鎖的執行緒解鎖為止。

遞迴互斥鎖能夠成功地返回,並且增加呼叫執行緒在互斥上加鎖的次數。

檢錯互斥鎖則為快速互斥鎖的非阻塞版本,它會立即返回並返回乙個錯誤資訊。

預設屬性為快速互斥鎖。

2.互斥鎖線程控制

互斥鎖的基本操作:

互斥鎖初始化:pthread_mutex_init()

函式原型:intpthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr)

函式引數:mutex:互斥鎖

attr:pthread_mutex_initializer:建立快速互斥鎖

pthread_recursive_mutex_initializer_np:建立遞迴互斥鎖

pthread_errorcheck_mutex_initializer_np:建立檢錯互斥鎖

互斥鎖上鎖:pthread_mutex_lock()

互斥鎖判斷上鎖:pthread_mutex_trylock()

互斥鎖解鎖:pthread_mutex_unlock()

消除互斥鎖:pthread_mutex_destroy()

pthread_mutex_lock()

pthread_mutex_trylock()

pthread_mutex_unlock()

pthread_mutex_destroy()

等函式類似,其函式引數只有互斥鎖。

3.訊號量執行緒控制

訊號量也就是作業系統中所用到的pv原子操作,它廣泛用於程序或執行緒間的同步與互斥。

訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。 

pv原子操作是對整數計數器訊號量sem的操作。

一次p操作使sem減一,而一次v操作使sem加一。

程序(或執行緒)根據訊號量的值來判斷是否對公共資源具有訪問許可權。

當訊號量sem的值大於等於零時,該程序(或執行緒)具有公共資源的訪問許可權;

相反,當訊號量sem的值小於零時,該程序(或執行緒)就將阻塞直到訊號量sem的值大於等於0為止。

4.關於訊號量的函式操作:

sem_init()用於建立乙個訊號量,並初始化它的值。

函式原型:int sem_init(sem_t *sem,int pshared,unsigned int value)

函式引數:sem:訊號量的指標

pshared:決定訊號量能否在幾個程序間共享,暫時取值為0,表示這個訊號量是當前程序的區域性訊號量。

value:訊號量初始化值

sem_wait()和sem_trywait()都相當於p操作,在訊號量大於零時它們都能將訊號量的值減一,

兩者的區別在於若訊號量小於零時,sem_wait()將會阻塞程序,而sem_trywait()則會立即返回。

sem_post():相當於v操作,它將訊號量的值加一同時發出訊號來喚醒等待的程序。

sem_getvalue():用於得到訊號量的值。

sem_destroy():用於刪除訊號量。

sem_wait()

sem_trywait()

sem_post()

sem_getvalue()

sem_destroy()

等函式類似,其函式引數只有訊號量指標。

執行緒之間和程序之間的同步

今天學習的內容為 利用互斥事件來控制線程之間 程序之間的同步問題。其實,程序之間的同步也就類似於執行緒之間的同步。互斥事件的作用就是為了保證任乙個時間內,只有乙個執行緒對對公共資源進行操作。下面來看一下執行緒之間的同步,如果是在乙個程序內的執行緒同步問題的話。這樣的例子很多,我就舉乙個最簡單的,執行...

Windows下多執行緒之間的互斥與同步

1.critical section 臨界區.它只能用於執行緒之間互斥 initializecriticalsection 2.互斥核心物件,可以用於執行緒之間互斥,也可於程序之間 createmutex 3.訊號量semaphore.可以用於執行緒之間同步,也可於程序之間 createsemaph...

多執行緒之間同步

1 posix訊號量 includeint sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem sem trywait sem t sem int sem...