資源描述:
《互斥鎖的使用》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。
1、互斥鎖索引:1.初始化互斥鎖pthread_mutex_init2.鎖定互斥鎖pthread_mutex_lock3.解鎖互斥鎖pthread_mutex_unlock4.非阻塞的鎖定互斥鎖pthread_mutex_trylock5.釋放互斥鎖pthread_mutex_destroy6.分級鎖定________________________________________1.初始化互斥鎖pthread_mutex_init#includeintpthread_mutex_init(pthread_mutex_t*mp,constpthread
2、_mutexattr_t*mattr);返回值:函數(shù)成功返回0;任何其他返回值都表示錯誤當輸入?yún)?shù)mattr為空指針時,pthread_mutex_init()函數(shù)以默認值初始化由參數(shù)mp指定的互斥鎖。當輸入?yún)?shù)mattr指向一個互斥鎖屬性對象時,pthread_mutex_init()函數(shù)被用來創(chuàng)建一個指定屬性的互斥鎖,其屬性為參數(shù)mattr指向的互斥鎖屬性對象的屬性。初始化一個互斥鎖以后,這個互斥鎖處在解鎖狀態(tài)。對于靜態(tài)定義的互斥鎖,可以直接通過宏PTHREAD_MUTEX_INITIALIZER將其初始化為具有缺省屬性。如:pthread_mutex_tmp=PTH
3、READ_MUTEX_INITIALIZER;當其他線程仍然需要使用某個互斥鎖時,這個互斥鎖不能被重新初始化或釋放。否則將會造成程序故障,在釋放、初始化一個互斥鎖之前,應用程序必須先確認這個互斥鎖未被使用。2.鎖定互斥鎖pthread_mutex_lock#includeintpthread_mutex_lock(pthread_mutex_t*mutex);返回值:函數(shù)成功返回0;任何其他返回值都表示錯誤鎖定mutex參數(shù)指向的互斥鎖對象。當這個函數(shù)返回時,相應的互斥鎖被鎖定,調用pthread_mutex_lock函數(shù)的線程成為這個互斥鎖的擁有者
4、。如果這個互斥鎖已經(jīng)被其他線程鎖定,那么調用pthread_mutex_lock函數(shù)的線程將一直被阻塞,直到獲得這個互斥鎖。錯誤檢測和死鎖處理依賴于互斥鎖類型。3.解鎖互斥鎖pthread_mutex_unlock#includeintpthread_mutex_unlock(pthread_mutex_t*mutex);返回值:函數(shù)成功返回0;任何其他返回值都表示錯誤解開已鎖定了的互斥鎖。解開互斥鎖的具體操作根據(jù)互斥鎖類型的不同而不同。如果調用pthread_mutex_unlock解開一個互斥鎖時,有多個線程正被這個互斥鎖阻塞,那么系統(tǒng)將根據(jù)調度
5、策略決定哪個線程將獲得這個互斥鎖(對于PTHREAD_MUTEX_RECURSIVE類型的互斥鎖來說,只有當互斥鎖的鎖定計數(shù)減少為0時,pthread_mutex_unlock函數(shù)才會解開這個互斥鎖,調度被這個互斥鎖阻塞的線程)。在缺省的調度策略(SCHED_OTHER)下,一般是按照線程的優(yōu)先級高低來釋放阻塞線程,重新鎖定互斥鎖。4.非阻塞的鎖定互斥鎖pthread_mutex_trylock#includeintpthread_mutex_trylock(pthread_mutex_t*mutex);返回值:函數(shù)成功返回0;任何其他返回值都表示錯
6、誤函數(shù)是pthread_mutex_lock函數(shù)的非阻塞版本。如果mutex參數(shù)所指定的互斥鎖已經(jīng)被鎖定的話,調用pthread_mutex_trylock函數(shù)不會阻塞當前線程,而是立即返回一個值來描述互斥鎖的狀況。5.釋放互斥鎖pthread_mutex_destroy#includeintpthread_mutex_destroy(pthread_mutex_t*mp);返回值:函數(shù)成功返回0;任何其他返回值都表示錯誤將相應互斥鎖還原成未初始化狀態(tài),使以后對該互斥鎖的訪問都無效。注意:存儲互斥鎖的內存并未被釋放。6.分級鎖定有時候我們會需要一次訪
7、問兩個資源。也許當你使用一個資源時發(fā)現(xiàn)還需要另外一個資源。當兩個線程試圖同時占用兩個資源,并按不同的次序鎖定相應的互斥鎖時,有可能會產(chǎn)生死鎖。解決這個問題的最好方法是,確保線程鎖定多個互斥鎖時,按同一個順序進行鎖定。這項技術被叫做分級鎖定:為互斥鎖指定邏輯序號并按序號安排鎖定的次序。也就是說,當你鎖定了一個邏輯序號比n大的互斥鎖時,不能再鎖定一個邏輯序號為n的互斥鎖。但在有的情況下,你必須不按預定的順序來鎖定互斥鎖。為了防止這種情況下出現(xiàn)死鎖,可使用pthread_mutex_trylock()函數(shù)。使用這個函數(shù)時注意,當線程