天天看點

Linux線程同步介紹和示例線程同步的概念互斥鎖版權聲明

線程同步的概念

       線程同步?怎麼同步?一起運作?一起停止?我當年聽說線程同步這個詞的時候,也是一頭霧水。

       在人們的日常生活中,所說的鎖大概有兩種:一種是不允許通路;另一種是資源忙,同一時間隻允許一個使用者占用,其它使用者如果要使用,必須要等待。

       1)不允許通路的鎖好了解,就像每戶人家的鎖,不允許外人進入。

       2)第二種鎖,例如火車上的廁所,它是公共的,空閑的時候任何人可以進入,人進去以後就會把它鎖起來,其它的人如果要上廁所,必須等待解鎖,即裡面的人出來。還有紅綠燈,紅燈是加鎖,綠燈是解鎖。

       對多線程來說,資源是共享的,基本上不存在不允許通路的情況,但是,共享的資源在某一時間點隻能有一個線程占用,這種情況是存在的,是以需要給資源加鎖。

       不知道是什麼人采用了線程同步這個詞,如果讓我的命名,我會定義為線程鎖,鎖線程嗎?不是,是鎖共享資源,線程給共享資源加的鎖。

       線程的鎖的種類有互斥鎖、讀寫鎖、條件變量、自旋鎖、信号燈。

       在本章節中,隻介紹互斥鎖,其它的鎖應用場景極少,數十年來,我從來沒有用過。

互斥鎖

       互斥鎖機制是同一時刻隻允許一個線程占有共享的資源。

1、初始化鎖

              int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

       其中參數 mutexattr 用于指定鎖的屬性(見下),如果為NULL則使用預設屬性。

       互斥鎖的屬性在建立鎖的時候指定,當資源被某線程鎖住的時候,其它的線程在試圖加鎖時表現将不同。目前有四個值可供選擇:

       1)PTHREAD_MUTEX_TIMED_NP,這是預設值,也就是普通鎖。當一個線程加鎖以後,其餘請求鎖的線程将形成一個等待隊列,并在解鎖後按優先級獲得鎖。這種鎖政策保證了資源配置設定的公平性。

       2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。

       3)PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則傳回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。

       4)PTHREAD_MUTEX_ADAPTIVE_NP,适應鎖,動作最簡單的鎖類型,等待解鎖後重新競争。

2、阻塞加鎖

              int pthread_mutex_lock(pthread_mutex *mutex);

3、非阻塞加鎖

              int pthread_mutex_trylock( pthread_mutex_t *mutex);

       該函數語義與 pthread_mutex_lock() 類似,不同的是在鎖已經被占據時立即傳回 EBUSY,不是挂起等待。

4、解鎖(要求鎖是lock狀态,并且由加鎖線程解鎖)

              int pthread_mutex_unlock(pthread_mutex *mutex);

5、銷毀鎖(此時鎖必需unlock狀态,否則傳回EBUSY)

              int pthread_mutex_destroy(pthread_mutex *mutex);

版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的連結。

來源:C語言技術網(www.freecplus.net)

作者:碼農有道

如果這篇文章對您有幫助,請點贊支援,或在您的部落格中轉發我的文章,謝謝!!!

如果文章有錯别字,或者内容有誤,或其他的建議或意見,請您留言指正,非常感謝!!!

繼續閱讀