進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決
執行緒之間對資源的競爭:
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.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...
執行緒的同步與互斥
什麼是臨界資源?多個程序不能同時使用的資源叫做臨界資源。什麼是臨界區?每個執行緒訪問臨界資源的那段 稱作臨界區 作業系統在引入執行緒的併發性了以後,隨即帶來的就是資源共享和競爭的問題 因為執行緒共享程序所擁有的所有資源 所以,執行緒的同步與互斥機制是相當重要的。什麼是同步,什麼是互斥?執行緒當中為了...