執行緒同步與互斥

2021-06-18 12:43:08 字數 1474 閱讀 7296

與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。

第一種機制:互斥鎖

互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。

互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式:

(1) 初始化函式:pthread_mutex_init();

#include

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr)

函式說明:mutex:互斥鎖

mutexattr:(1)pthread_mutex_initilazer:建立快速互斥鎖(一般預設屬性是建立這個) (2)pthread_recursive_mutex_initializer_np:建立遞迴互斥鎖

(3)pthread_errorcheck_mutex_initializer_np:建立檢測互斥鎖

成功返回0,錯誤返回錯誤碼。

(2)互斥鎖上鎖:pthread_mutex_lock(pthread_mutex_t *mutex);

判斷互斥鎖上鎖:pthread_mutex_trylock(pthread_mutex_t *mutex);

互斥鎖解鎖:pthread_mutex_unlock(pthread_mutex_t *mutex);

互斥鎖的消除:pthread_mutex_destory(pthread_mutex_t *mutex);

成功返回0,出錯返回-1.

第二種機制:訊號量

linux實現了posix的無名訊號量,用於執行緒中的互斥和同步。訊號量就是作業系統中的所用到的pv原子操作。同時適用於程序或執行緒的同步與互斥。

函式說明:

sem_init()建立乙個訊號量,並進行初始化

#include

int sem_init(sem_t *sem,int pshared,unsigned int value);

函式說明:

sem:訊號量的指標

pshared:決定是否訊號量被共享,這個值取0,表示當前的區域性訊號量。

value:需要初始化的值

函式成功返回0,錯誤返回-1.

sem_wait(sem_t *sem)和sem_trywait(sem_t *sem)相當於p操作,在訊號量大於0的時候能夠將訊號量的值減一;區別是若訊號量的值小於0時,sem_wait會將其阻塞,而後者立即返回。

sem_post(sem_t *sem)相當於v操作,它將訊號量的值加一

sem_getcalue(sem_t *sem)用於得到訊號量的值

sem_destroy(sem_t *sem)用於刪除訊號量

成功返回0,錯誤返回-1.

例子會後面補充,參看linux**類

執行緒同步與互斥

1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...

執行緒同步與互斥 互斥鎖

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

執行緒同步與互斥 互斥鎖

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