互斥鎖pthread_mutex_t的使用
有兩種方法建立互斥鎖,靜態方式和動態方式。POSIX定義了一個宏PTHREAD_MUTEX_INITIALIZER來靜態初始化互斥鎖,方法如下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實現中,pthread_mutex_t是一個結構,而PTHREAD_MUTEX_INITIALIZER則是一個結構常量。 動態方式是採用pthread_mutex_init()函式來初始化互斥鎖,API定義如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用於指定互斥鎖屬性(見下),如果為NULL則使用預設屬性。 pthread_mutex_destroy ()用於登出一個互斥鎖,API定義如下: int pthread_mutex_destroy(pthread_mutex_t *mutex) 銷燬一個互斥鎖即意味著釋放它所佔用的資源,且要求鎖當前處於開放狀態。由於在Linux中,互斥鎖並不佔用任何資源,因此LinuxThreads中的 pthread_mutex_destroy()除了檢查鎖狀態以外(鎖定狀態則返回EBUSY)沒有其他動作。 2. 互斥鎖屬性 互斥鎖的屬性在建立鎖的時候指定,在LinuxThreads實現中僅有一個鎖型別屬性,不同的鎖型別在試圖對一個已經被鎖定的互斥鎖加鎖時表現不同。當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇: * PTHREAD_MUTEX_TIMED_NP,這是預設值,也就是普通鎖。當一個執行緒加鎖以後,其餘請求鎖的執行緒將形成一個等待佇列,並在解鎖後按優先順序獲得鎖。這種鎖策略保證了資源分配的公平性。 * PTHREAD_MUTEX_RECURSIVE_NP,巢狀鎖,允許同一個執行緒對同一個鎖成功獲得多次,並透過多次unlock解鎖。如果是不同執行緒請求,則在加鎖執行緒解鎖時重新競爭。 * PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個執行緒請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP型別動作相同。這樣就保證當不允許多次加鎖時不會出現最簡單情況下的死鎖。 * PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動作最簡單的鎖型別,僅等待解鎖後重新競爭。 3. 鎖操作 鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖 pthread_mutex_trylock()三個,不論哪種型別的鎖,都不可能被兩個不同的執行緒同時得到,而必須等待解鎖。對於普通鎖和適應鎖型別,解鎖者可以是同程式內任何執行緒;而檢錯鎖則必須由加鎖者解鎖才有效,否則返回EPERM;對於巢狀鎖,文件和實現要求必須由加鎖者解鎖,但實驗結果表明並沒有這種限制,這個不同目前還沒有得到解釋。在同一程式中的執行緒,如果加鎖後沒有解鎖,則任何其他執行緒都無法再獲得鎖。 int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pthread_mutex_trylock(pthread_mutex_t *mutex) pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被佔據時返回EBUSY而不是掛起等待。 /*============================================================================== 注意:直接編譯gcc -o bufsem bufsem.c會出現如下錯誤 undefined reference to `sem_init' 編譯選項需要加入一個多執行緒 gcc -pthread -o bufsem bufsem.c */============================================================================== #include #define N 2 //佇列中元素的數量 struct _buf_ void * thread_function_r(void *arg); //執行緒函式 pthread_mutex_t mutex; //互斥鎖,保證執行緒訪問的互斥,步驟一,定義資料型別 int main(int argc, char *argv[]) int res; return 0; |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1041362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中的互斥鎖Python
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- 【go】golang中鎖的用法-互斥鎖Golang
- 執行緒同步與互斥:互斥鎖執行緒
- 執行緒的互斥鎖執行緒
- 讀寫鎖 ReentrantReadWriteLock 與 互斥鎖 的效率
- liteos互斥鎖(七)
- C 語言的 互斥鎖、自旋鎖、原子操作
- Go語言的互斥鎖MutexGoMutex
- 互斥鎖mutex的簡單實現Mutex
- 透過互斥鎖+條件量的方式實現同步與互斥
- 悲觀的併發策略——synchronized互斥鎖synchronized
- Go語言中的互斥鎖和讀寫鎖(Mutex和RWMutex)GoMutex
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等...Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等Java
- Linux之執行緒互斥鎖Linux執行緒
- python 協程 自定義互斥鎖Python
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- 執行緒安全: 互斥鎖和自旋鎖(10種)執行緒
- [譯] part25: golang Mutex互斥鎖GolangMutex
- Go 互斥鎖 Mutex 原始碼分析(二)GoMutex原始碼
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- Golang 讀寫鎖RWMutex 互斥鎖Mutex 原始碼詳解GolangMutex原始碼
- Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等Java
- Go 語言的原子操作和互斥鎖的區別Go
- Go 標準庫 —— sync.Mutex 互斥鎖GoMutex
- golang RWMutex讀寫互斥鎖原始碼分析GolangMutex原始碼
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- 面試官:你說說互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂觀鎖的應用場景面試
- Mysql(MyISAM)的讀寫互斥鎖問題的解決方法MySql
- python之GIL全域性直譯器鎖,自定義互斥鎖,死鎖與遞迴鎖Python遞迴
- 作業系統 訊號量vs互斥鎖作業系統
- Go併發程式設計之美-互斥鎖Go程式設計
- PHP 互斥鎖:如何確保程式碼的執行緒安全?PHP執行緒
- Golang 基礎值速學之二十一(讀寫鎖互斥鎖)Golang
- 互斥鎖(下):如何用一把鎖保護多個資源?
- 互斥鎖和訊號量有什麼不同?(譯)
- Python提高:關於GIL(全域性直譯器鎖)與執行緒互斥鎖的理解Python執行緒
- ZooKeeper 分散式鎖 Curator 原始碼 04:分散式訊號量和互斥鎖分散式原始碼