執行緒的同步與互斥

2021-07-24 05:32:06 字數 3358 閱讀 8776

進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決

執行緒之間對資源的競爭:

1. 互斥量mutex

2. 訊號燈semaphore

3. 條件變數

conditions

mutex

互斥鎖線程控制 1

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

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

、在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖乙個已經被上鎖的互斥鎖,則該執行緒就會掛起,直到上鎖的執行緒釋放掉互斥鎖為止。

互斥鎖的基本操作:

一、互斥鎖初始化:

pthread_mutex_init()

函式的作用:初始化互斥鎖

函式的原型:

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

函式的引數:

mutex:

互斥鎖;

mutexattr:pthread_mutex_initializer:

快速互斥鎖;

返回值:成功為

0;出錯

<0;

二、互斥鎖上鎖:

pthread_mutex_lock()

函式的作用:對互斥鎖上鎖;

函式的原型:

pthread_mutex_lock(pthread_mutex_t *mutex);

返回值:

0;出錯

:-1;

互斥鎖判斷上鎖:

pthread_mutex_trylock(pthread_mutex_t  *mutex)

互斥鎖解鎖:

pthread_mutex_unlock(pthread_mutex_t *mutex)

消除互斥鎖:

該段程式成功實現了執行緒

1上鎖時執行緒

2無法執行,待執行緒

1 完全執行結束後,執行緒

2才繼續執行;

訊號量執行緒控制

訊號量也就是作業系統中所用到的

pv原子操作,它廣泛用於程序或執行緒間的同步與互斥。

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

原子操作是對整數計數器訊號量

sem的操作。 一次

p操作使

sem減一,而一次

v操作使

sem加一。

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

當訊號量

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

相反,當訊號量

sem的值小於零時,該程序(或執行緒)就將阻塞直到訊號量

sem的值大於等於

0為止。

pv原子操作主要用於程序或執行緒間的同步和互斥這兩種典型情況。

對於互斥,其基本流程圖如下:

關於同步,其操作流程圖如下圖所示:

訊號量的執行緒控制

linux

實現了posix

的無名訊號量,主要用於執行緒間的互斥與同步。以下主要介紹幾個常見函式。 1

、sem_init()

函式作用:用於建立乙個訊號量,並初始化它的值。

函式原型:

int sem_init(sem_t  *sem,int psharee,unsigned  int value);

函式引數:

sem:

訊號量指標;

pshared:0;

value:

訊號量的初始值;

返回值:成功

0,出錯-1;

標頭檔案:

#include 2

、sem_wait()

和sem_trywait()

都相當於

p操作,在訊號量大於零時它們都能將訊號量的值減一,兩者的區別在於若訊號量小於零時,

sem_wait()

將會阻塞程序,而

sem_trywait()

則會立即返回。

sem_wait()

函式原型:

int sem_wait(sem_t  *sem);

int sem_trywait(sem_t  *sem);

int sem_post(sem_t  *sem);v操作

int sem_getvalue(sem_t  *sem);

int sem_destroy(sem_t  *sem);

函式引數:

sem:

訊號量指標;

返回值:成功

0,出錯-1;

執行緒同步與互斥

與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...

執行緒同步與互斥

1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...

執行緒的同步與互斥

什麼是臨界資源?多個程序不能同時使用的資源叫做臨界資源。什麼是臨界區?每個執行緒訪問臨界資源的那段 稱作臨界區 作業系統在引入執行緒的併發性了以後,隨即帶來的就是資源共享和競爭的問題 因為執行緒共享程序所擁有的所有資源 所以,執行緒的同步與互斥機制是相當重要的。什麼是同步,什麼是互斥?執行緒當中為了...