執行緒同步與互斥 互斥鎖

2021-08-10 19:07:19 字數 3625 閱讀 5850

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時(還沒有列印完),別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。

下面我們用程式模擬一下這個過程,執行緒一需要列印「 hello 」,執行緒二需要列印「 world 」,不加任何處理的話,列印出來的內容會錯亂:

[cpp]view plain

copy

#include 

#include 

#include 

// 印表機

void

printer(

char

*str)  

printf("\n"

);   

}  // 執行緒一

void

*thread_fun_1(

void

*arg)  

// 執行緒二

void

*thread_fun_2(

void

*arg)  

intmain(

void

)    

執行結果如下:

實際上,印表機是有做處理的,我在列印著的時候別人是不允許列印的,只有等我列印結束後別人才允許列印。這個過程有點類似於,把印表機放在乙個房間裡,給這個房間安把鎖,這個鎖預設是開啟的。當 a 需要列印時,他先過來檢查這把鎖有沒有鎖著,沒有的話就進去,同時上鎖在房間裡列印。而在這時,剛好 b 也需要列印,b 同樣先檢查鎖,發現鎖是鎖住的,他就在門外等著。而當 a 列印結束後,他會開鎖出來,這時候 b 才進去上鎖列印。

互斥鎖是一種簡單的加鎖的方法來控制對共享資源的訪問,互斥鎖只有兩種狀態,即上鎖( lock )和解鎖( unlock )。

互斥鎖的操作流程如下:

1)在訪問共享資源後臨界區域前,對互斥鎖進行加鎖。

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

3)對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的執行緒將會被阻塞,直到鎖被釋放。

互斥鎖的資料型別是:pthread_mutex_t

以下函式需要的標頭檔案:

#include

1)初始化互斥鎖int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);功能:

初始化乙個互斥鎖。

引數:

mutex

:設定互斥量的屬性,通常可採用預設屬性,即可將 attr 設為 null。

可以使用巨集 pthread_mutex_initializer 靜態初始化互斥鎖,比如:

pthread_mutex_t  mutex = pthread_mutex_initializer;
這種方法等價於使用 null 指定的 attr 引數呼叫 

pthread_mutex_init

() 來完成動態初始化,不同之處在於 

pthread_mutex_initializer

巨集不進行錯誤檢查。

返回值:

成功:0,成功申請的鎖預設是開啟的。

失敗:非 0 錯誤碼

2)上鎖int pthread_mutex_lock(pthread_mutex_t *mutex);功能:

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

引數:

mutex

返回值:

成功:0

失敗:非 0 錯誤碼

int pthread_mutex_trylock(pthread_mutex_t *mutex);

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

3)解鎖

int pthread_mutex_unlock(pthread_mutex_t * mutex);

功能:

對指定的互斥鎖解鎖。

引數:

mutex

返回值:

成功:0

失敗:非 0 錯誤碼

4)銷毀互斥鎖int pthread_mutex_destroy(pthread_mutex_t *mutex);功能:

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

引數:

mutex

返回值:

成功:0

失敗:非 0 錯誤碼

我們通過互斥鎖完善上面的例子,示例**如下:

[cpp]view plain

copy

#include 

#include 

#include 

pthread_mutex_t mutex; //互斥鎖

// 印表機

void

printer(

char

*str)  

printf("\n"

);   

pthread_mutex_unlock(&mutex); //解鎖

}  // 執行緒一

void

*thread_fun_1(

void

*arg)  

// 執行緒二

void

*thread_fun_2(

void

*arg)  

intmain(

void

)    

執行結果如下:

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步與互斥 實現互斥鎖

今天我們來分享一下,執行緒同步與互斥 互斥鎖的實現。多個執行緒同時訪問共享資料時可能會產生衝突,造成程式執行結果不是我們所預期的結果。不產生衝突的多執行緒訪問情況,和截圖如下 產生衝突的多執行緒訪問情況,和截圖如下 注 每執行一次,結果都可能會不同。由於多執行緒訪問共享資料時可能會產生衝突,不能保證...

執行緒同步與互斥 互斥鎖(mutex)

在多執行緒訪問共享資料的時候可能會發生衝突,例如 衝突的例子 include include include includeint common data 0 公共資料 void increase data void vptr return null int main void err pthrea...