Linux 執行緒同步方法 互斥鎖

2021-07-26 17:17:34 字數 1528 閱讀 4147

在單執行緒條件下,由於對資料操作,在同樣的時間下,只有乙個執行緒來操作。所以不用擔心資料的同步問題。現代的作業系統,大都提供併發機制,雖然有時候是表面的併發。在

linux

中,併發用的最多的是基於執行緒的併發,程序的代價太高了,這樣,乙個共享的資料,在同一時間內,可能有多個執行緒在操作。如果沒有同步機制,那麼想要保證每個執行緒操作的正確性,是很困難的。

互斥鎖提供乙個可以在同一時間,只讓乙個執行緒訪問臨界資源的的操作介面。互斥鎖(mutex)是個提供執行緒同步的基本鎖。讓上鎖後,其他的執行緒如果想要鎖上,那麼會被阻塞,直到鎖釋放後。

如果,在鎖釋放後,有多個執行緒被阻塞,那麼,所有的被阻塞的執行緒會被設為可執行狀態。第乙個執行的執行緒,取得鎖的控制權,上鎖。其他的執行緒繼續阻塞。

互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點:

互斥鎖的系統原型為:pthread_mutex_t,在用互斥鎖之前,必須要初始化互斥鎖,可以呼叫pthread_mutex_init;或者是pthread_mutex_initialzer(僅用於靜態分配記憶體)如果我們動態分配互斥鎖(比如,用malloc),那麼,在釋放記憶體之前,必須呼叫pthread_mutex_destroy;

下面為互斥鎖初始化和銷毀的函式原型:

#include 

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

both return: 0 if ok, error number on failure

互斥鎖的上鎖和解鎖的函式原型為:

#include 

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

all return: 0 if ok, error number on failure

如果要鎖上乙個互斥鎖用pthread_mutex_lock,當pthread_mutex_lock()返回時,該

互斥鎖已被鎖定。

執行緒呼叫該函式讓互斥鎖上鎖,如果該互斥鎖已被另乙個執行緒鎖定和擁有,則呼叫該執行緒將阻塞,直到該互斥鎖變為可用為止;解鎖用pthread_mutex_unlock;如果,乙個執行緒不想被阻止,那麼可以用pthread_mutex_trylock函式來上鎖。如果乙個執行緒呼叫pthread_mutex_trylock時,鎖變數沒有被其他的執行緒鎖上,那麼pthread_mutex_trylock會鎖上鎖變數,返回值0,表示成功。否則,pthread_mutex_trylock失敗,返回ebusy,沒有上鎖。

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...

Linux多執行緒同步 互斥鎖

當多個執行緒對同乙個資源進行訪問的時候,為了這個資源的安全性,我們需要對這個資源進行鎖定,規定同一時間只有乙個資源能夠獲得該鎖的鑰匙,其它執行緒要獲得該資源需要等待該執行緒 互斥鎖建立 pthread mutex t mutex 互斥鎖初始化 mutex pthread mutex initiali...

執行緒同步 互斥鎖

一 為什麼要用多執行緒?避免阻塞 乙個程序如果只有乙個執行緒的話,當這個乙個執行緒阻塞則就整個程序阻塞,無法再去完成其他事情。提高效率,避免cpu空 程式經常涉及讀寫操作就會訪問磁碟,這些操作的速度比cpu慢的多,而為了等待這些操作的響應,cpu又不能去幹其他的事情或者處理新的請求,導致這種單執行緒...