執行緒同步(一) 互斥鎖

2021-10-07 11:58:46 字數 1640 閱讀 4290

在程式設計中,引入了物件互斥鎖的概念,來保證共享資料操作的完整性。每個物件都對應於乙個可稱為" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有乙個執行緒訪問該物件。

互斥鎖(又名互斥量)強調的是資源的訪問互斥:互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這個資源。

互斥鎖的建立方式有兩種:靜態方式和動態方式

靜態方式

posix定義了乙個巨集pthread_mutex_initializer來靜態初始化互斥鎖,方法如下:

pthread_mutex_t mutex=pthread_mutex_initializer動態方式

動態方式是採用pthread_mutex_init()函式來初始化互斥鎖,api定義如下:

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

其中mutexattr用於指定互斥鎖屬性,如果為null則使用預設屬性。

函式原型:int pthread_mutex_destroy(pthread_mutex_t *mutex)

銷毀乙個互斥鎖即意味著釋放它所占用的資源,且要求鎖當前處於開放狀態。由於在linux中,互斥鎖並不占用任何資源,因此linuxthreads中的 pthread_mutex_destroy()除了檢查鎖狀態以外(鎖定狀態則返回ebusy)沒有其他動作。

加鎖:int pthread_mutex_lock(pthread_mutex_t *mutex)解鎖:int pthread_mutex_unlock(pthread_mutex_t *mutex)trylock:int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被佔據時返回ebusy而不是掛起等待。

兩個執行緒分別交替列印"hello world"、「hello world」:

#include

#include

#include

#include

#include

#include

pthread_mutex_t mutex;

//定義一把互斥鎖

void

*tfn

(void

*arg)

return

null;}

intmain

(void

)pthread_create

(&tid,

null

, tfn,

null);

while(1

)pthread_join

(tid,

null);

pthread_mutex_destroy

(&mutex)

;//銷毀互斥鎖

return0;

}

執行緒同步 互斥鎖

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

執行緒同步與互斥 互斥鎖

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

執行緒同步與互斥 互斥鎖

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