多執行緒程式設計 互斥鎖 條件變數

2021-09-12 06:07:25 字數 1946 閱讀 2600

一,互斥鎖

在多工作業系統中,有很多任務同時執行,這些任務可能會用到同乙個資源,如果沒有一種機制來控制這些任務共享同乙個資源,那這些任務可能無法正常使用自己想用的資源。互斥鎖--是多工作業系統中一種簡單的加鎖方法,來控制各任務對共享資源的訪問。

互斥鎖的狀態:上鎖(lock)和解鎖(unlock);

互斥鎖的操作函式:

1 初始化乙個互斥鎖。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

2 對互斥鎖上鎖,若互斥鎖已經上鎖,則呼叫者一直阻塞,直到互斥鎖解鎖後再上鎖。

int pthread_mutex_lock(pthread_mutex_t *mutex);

3 呼叫該函式時,若互斥鎖未加鎖,則上鎖,返回 0;若互斥鎖已加鎖,則函式直接返回失敗,即 ebusy。

int pthread_mutex_trylock(pthread_mutex_t *mutex);

4 對指定的互斥鎖解鎖。

int pthread_mutex_unlock(pthread_mutex_t *mutex);

5 銷毀指定的乙個互斥鎖。互斥鎖在使用完畢後,必須要對互斥鎖進行銷毀,以釋放資源。

int pthread_mutex_destroy(pthread_mutex_t *mutex);

互斥鎖操作流程:

1. 在訪問共享資源後臨界區域前,對互斥鎖進行加鎖,若互斥鎖已經上鎖則執行緒阻塞,直到鎖被釋放;

2. 在訪問完成後釋放互斥鎖導上的鎖。

二,條件變數

條件變數--自動阻塞乙個執行緒,直到某條件發生,一般和互斥鎖同時使用。

操作函式:

1 初始化條件變數

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);

2 阻塞等待

int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

3 超時等待

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

4 解除所有執行緒的阻塞

int pthread_cond_destroy(pthread_cond_t *cond);

5 至少喚醒乙個等待該條件的執行緒

int pthread_cond_signal(pthread_cond_t *cond);

6 喚醒等待該條件的所有執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);

三,互斥鎖和條件變數共同使用

1 互斥鎖為什麼需要條件變數?

互斥鎖的特點是資源的」無序訪問「,想一下,如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行狀態,第乙個變為執行狀態的執行緒可以對互斥鎖加鎖,其他執行緒將會看到互斥鎖依然被鎖住,只能回去再次等待它重新變為可用。 條件變數(cond)是在多執行緒程式中用來實現"等待--》喚醒"邏輯常用的方法。條件變數利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使「條件成立」。有了條件變數就可以避免多個阻塞的執行緒同時被喚醒,而是同步執行。

2 條件變數為什麼需要互斥鎖?

這就回到多工共享資源的問題,為了防止由於執行緒併發執行所引起的資源競爭,所以要讓每個執行緒互斥的訪問公有資源,這就需要對共有資源進行加鎖。

3 使用方法

pthread_mutex_lock(&mutex)

if()

pthread_cond_wait(&cond, &mutex);

pthread_mutex_unlock(&mutex);

linux 多執行緒程式設計 互斥鎖與條件變數

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起,另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。下面這個例子展示的是互斥鎖和條件變數的結合使用,以及取消對於條件等待動作的影響,...

Linux C 多執行緒程式設計互斥鎖與條件變數

linux c 多執行緒程式設計互斥鎖與條件變數 include mylib.h define buffer size 5 產品庫存大小 define product cnt 30 產品生產總數 struct product cons buffer void init struct product ...

Posix多執行緒程式設計(1) 互斥鎖與條件變數

今天學習了多執行緒互斥鎖與條件變數,為了防止以後忘記,先記錄一下總結的工作流程 主要是函式pthread cond timewait 下面是posix多執行緒程式設計中cond.c的 加入幾條列印資訊 工作流程總結如下 1 首先,主線程工作,鎖住互斥鎖,然後檢測 謂詞 value,結果value 0...