在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時(還沒有列印完),別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印「 hello 」,執行緒二需要列印「 world 」,不加任何處理的話,列印出來的內容會錯亂:
#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 才進去上鎖列印。
互斥鎖的操作流程如下:
1)在訪問共享資源後臨界區域前,對互斥鎖進行加鎖。互斥鎖的資料型別是: pthread_mutex_t。2)在訪問完成後釋放互斥鎖導上的鎖。
3)對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的執行緒將會被阻塞,直到鎖被釋放。
互斥鎖基本操作:
以下函式需要的標頭檔案:
1)初始化互斥鎖
#include
intpthread_mutex_init
(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr)
;
功能:
初始化乙個互斥鎖。引數:
mutex:互斥鎖位址。型別是 pthread_mutex_t 。attr:設定互斥量的屬性,通常可採用預設屬性,即可將 attr 設為 null。返回值:可以使用巨集 pthread_mutex_initializer 靜態初始化互斥鎖,比如:
pthread_mutex_t mutex = pthread_mutex_initializer;
成功:0,成功申請的鎖預設是開啟的。2)上鎖失敗:非 0 錯誤碼
int
pthread_mutex_lock
(pthread_mutex_t *mutex)
;int
pthread_mutex_trylock
(pthread_mutex_t *mutex)
;//不會堵塞直接返回
功能:
1、對互斥鎖上鎖,若互斥鎖已經上鎖,則呼叫者一直阻塞,直到互斥鎖解鎖後再上鎖。引數:2、呼叫該函式時,若互斥鎖未加鎖,則上鎖,返回 0;若互斥鎖已加鎖,則函式直接返回失敗,即 ebusy
返回值:
成功:03)解鎖失敗:非 0 錯誤碼
int
pthread_mutex_unlock
(pthread_mutex_t * mutex)
;
功能:
對指定的互斥鎖解鎖。引數:
返回值:
成功:04)銷毀互斥鎖失敗:非 0 錯誤碼
int
pthread_mutex_destroy
(pthread_mutex_t *mutex)
;
功能:
銷毀指定的乙個互斥鎖。互斥鎖在使用完畢後,必須要對互斥鎖進行銷毀,以釋放資源。引數:
返回值:
成功:0互斥鎖應用例項我們通過互斥鎖完善上面的例子,示例**如下:失敗:非 0 錯誤碼
#include
#include
#include
pthread_mutex_t mutex;
//互斥鎖
// 印表機
void
printer
(char
*str)
printf
("\n");
pthread_mutex_unlock
(&mutex)
;//解鎖
}// 執行緒一
void
*thread_fun_1
(void
*arg)
// 執行緒二
Linux系統程式設計 執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
linux程式設計 執行緒 互斥鎖
執行緒間同步機制 互斥鎖通訊機制 互斥以排他方式防止共享資料被併發修改。1 在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,並立即占有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。2 只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作...
linux系統程式設計 執行緒
include int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg include include include include include include...