linux多執行緒程式設計之互斥鎖

2021-06-22 22:11:05 字數 2401 閱讀 3237

執行緒的同步問題

乙個程序中的多個執行緒是共享同一段資源的,由於執行緒對資源的競爭引出了鎖。其中mutex是一種簡單的加鎖方法,這個互斥鎖只有兩種狀態,那就是上鎖和解 鎖,可以把互斥鎖看作是某種意義上的全域性變數。在某一時刻,只能有乙個執行緒取得這個互斥上的鎖,擁有上鎖狀態的執行緒可以對共享資源進行操作,而其他執行緒在 該執行緒未解鎖之前,夠會被掛起,直到上鎖的執行緒解開鎖。可以這麼說,互斥鎖使得共享資源按序的在各個執行緒上操作。

互斥鎖的操作主要包括互斥鎖初始化、上鎖、判斷上鎖、解鎖、摧毀互斥鎖。其中互斥鎖可以分為快速互斥鎖、遞迴互斥鎖和檢錯互斥鎖。這三種鎖的區別主要在於其他未占有互斥鎖的執行緒在希望得到互斥鎖時是否需要等待掛起。快速鎖是指呼叫執行緒會阻塞直到執行緒鎖得到解鎖止。遞迴鎖能夠成功地返回並且增加呼叫執行緒在 互斥上的加鎖次數,比如乙個鍊錶在進行插入的操作時,可以進行查詢的操作。檢錯鎖則為快速互斥鎖的非阻塞版本,它會立即返回並返回乙個錯誤的資訊。

1、函式簡義。

(1)互斥鎖初始化函式:

標頭檔案:     

函式原型:   int pthread_mutex_init (pthread_mutex_t* mutex,

const pthread_mutexattr_t* mutexattr);

函式傳入值:

mutex:互斥鎖。

mutexattr:pthread_mutex_initializer:建立快速互斥鎖。 

pthread_recursive_mutex_initializer_np:建立遞迴互斥鎖。

pthread_errorcheck_mutex_initializer_np:建立檢錯互斥鎖。

函式返回值:         成功:0

出錯:-1 

(2)互斥鎖相關函式:

加鎖:int pthread_mutex_lock(pthread_mutex_t* mutex);

判斷上鎖:嘗試對互斥量進行加鎖.若呼叫該函式時互斥量處於未鎖住狀態,那麼該函式將鎖住互斥量,否則返回ebusy.

int pthread_mutex_trylock (pthread_mutex_t* mutex);

解鎖:int pthread_mutex_unlock (pthread_mutex_t* mutex);

摧毀互斥鎖:

int pthread_mutex_destroy (pthread_mutex_t* mutex);

函式傳入值:            mutex:互斥鎖。

函式返回值:            成功返回0

否則返回錯誤編號

2、互斥鎖的具體實現:

#include

#include

#include

#include

#include

#include

#include

typedef struct pthread_mutex_related_tag

pthread_mutex_related;

static void mutex_init(pthread_mutex_related *pmr);

static void *test_func1();

static void *test_func2();

int main()

if((pthread_create(&pthread_id2, null, test_func2, pmr))!=0)

pthread_join(pthread_id1, null);

pthread_join(pthread_id2, null);

pthread_mutex_destroy(&pmr->mutex);

return 0;

}static void mutex_init(pthread_mutex_related *pmr)

static void *test_func1(pthread_mutex_related *pmr)

else

change var

pmr->lock_var ++;

the mutex

if(pthread_mutex_unlock(&pmr->mutex)!=0)

else

}pthread_exit((void *)1);

}static void *test_func2(pthread_mutex_related *pmr)

else

else

pmr->lock_var--;

ret = pthread_mutex_unlock (&pmr->mutex);

if (ret != 0)

sleep (3);}}

pthread_exit((void *)2);

}

多執行緒之互斥鎖

當執行緒之間需要用到共同的變數時,不希望某乙個執行緒使用時,被其它執行緒給呼叫,就需要互斥鎖來保證共享資源該執行緒使用完後,再給其它執行緒使用 典型例子 由於執行緒是獲取到作業系統分配的cpu時間片是才會執行,所以單cpu的情況下,多執行緒同步其實並非同步,當其中乙個執行緒1執行的時候,可能會中途跳...

Linux多執行緒程式設計 執行緒互斥鎖

通過下面的練習加深對執行緒的概念的理解,同時明確執行緒的控制。從而進一步了解執行緒的互斥,並學會利用pthread庫。定義乙個用於互斥的互斥鎖 和乙個主函式和兩個子執行緒都能訪問的共享變數,乙個主函式和兩個用來建立子執行緒的子函式 在主函式中定義兩個子執行緒id的變數,初始化互斥鎖,建立對應函式的子...

多執行緒程式設計 互斥鎖

多執行緒程式設計 互斥鎖 1 引言 互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 1 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...