【轉載】互斥鎖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而不是掛起等待。
相關推薦
【轉載】互斥鎖pthread_mutex_t的使用(轉載)
1. 互斥鎖建立有兩種方法建立互斥鎖,靜態方式和動態方式。POSIX定義了一個巨集PTHREAD_MUTEX_INITIALIZER來靜態初始化互斥鎖,方法如下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;在LinuxThreads實現中,pthrea
【轉載】CSS3之Clip(裁剪)拓展閱讀
很多 fix 以及 flow script stat browser hid 一定的 Clip屬性是大家經常會誤解的一個屬性,這篇文章幫助大家充分的了解和學習clip屬性,用這個屬性制作出更好的效果。 我可以確定Clip屬性有很多同學並不知道,因為這個屬性使用率非常的底,我
【MySQL】權限管理(轉載)
ant tin 視圖 臨時 允許 proc shu func for rom http://hi.baidu.com/lrood/blog/item/e52273b4260f71c737d3ca6e.html本文實例,運行於 MySQL 5.0 及以上版本。MySQL 賦
【轉載】DELPHI操作excel(轉)
DELPHI操作excel(轉) (一) 使用動態建立的方法 首先建立 Excel 物件,使用ComObj: var ExcelApp: Variant; ExcelApp := CreateOleObject( ''Excel.Application'' );
【轉載】TensorFlow實戰——CNN(VGGNet19)——影象風格轉化
轉自http://blog.csdn.net/u011239443/article/details/73721903 這次我們要做一件比較有趣的事——講影象風格轉化。 如何將一張杭州西湖圖片: 將其風格轉化為和梵高的《星夜》一樣具有鮮明藝術的風格呢? 先給出完整的
【SQL】- 基礎知識梳理(八) - 事務與鎖
隔離性 rep del 數據表 訪問 關系 snapshot 轉換 pro 事務的概念 事務:若幹條T-SQL指令組成的一個操作數據庫的最小執行單元,這個整體要麽全部成功,要麽全部失敗。(並發控制) 事務的四個屬性:原子性、一致性、隔離性、持久性。稱為事務的ACID特性。
【漫畫】互斥鎖ReentrantLock不好用?試試讀寫鎖ReadWriteLock
ReentrantLock完美實現了互斥,完美解決了併發問題。但是卻意外發現它對於讀多寫少的場景效率實在不行。此時ReentrantReadWriteLock來救場了!一種適用於讀多寫少場景的鎖,可以大幅度提升併發效率,你必須會哦! # 序幕 ![_1](https://yqfile.alicdn.com
【php】面向對象(一)
打電話 成員方法 駝峰命名 bject 內部 自動 正在 自己 div 1. 學習面向對象的目標: a) 語法的學習: b) 編程思想的學習: i. 過程化: ii. 面向對象:2. 比較(有對象和沒對象的區別) a) 沒對象: i. 我餓了 自己
【php】面向對象(五)
row 操作類 面向對象 ssa getline var pre span 錯誤信息 一、 類型約束: a) 約束函數可傳入的參數類型二、 類的遍歷 a) Foreach b) 可以將類當中的所有成員屬性遍歷出來三、 關於操作類與對象的一些函數: a) 判斷函數
【php】面向對象(三)
lamp1 變量 步驟 efi 第一個 面向對象 我們 ati 單例 知識點關鍵詞:FSCICATS一、 f => final: a) 是一個修飾符,用來修飾類和成員方法 b) 使用final修飾符修飾的類不能被繼承,使用final修飾符修飾的成員方法,不能被重寫
Android自己定義組件系列【6】——進階實踐(3)
err ack XML @+ layout apk get ast edi 上一篇《Android自己定義組件系列【5】——進階實踐(2)》繼續對任老師的《可下拉的PinnedHeaderExpandableListView的實現》進行了分析,這一篇計劃中間插一段“知識點
Android自己定義組件系列【5】——進階實踐(2)
col fonts tle 適配 pack tom ica void log 上一篇《Android自己定義組件系列【5】——進階實踐(1)》中對任老師的《可下拉的PinnedHeaderExpandableListView的實現》前一部分進行了實現,這一篇我們來看看Ex
Python自動化開發課堂筆記【Day06】 - Python進階(類)
擴展性 程序 lex 類名 人物 優點 ini 參數 self. 類與對象 面向過程的程序設計: 優點:極大的降低了程序的復雜度 缺點:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即使能,也是得大改,改一個組件,牽一發而動全身面向對象的程序設計
【原創】淺談webview(一)——驚鴻一瞥
版本 開發 spa 占用 混合 原創 大量 功能性 內存泄漏 眾所周知,APP開發過程中經常會通過webview實現HTML5(H5)的渲染,實現H5和Native的混合開發(Hybrid Development)。Hybrid Development可以加速
luogu_3379 【模板】最近公共祖先(LCA)
span oid ont return mes ace print next using #include<bits/stdc++.h>using namespace std;#define N 500010*2struct edge{int v,next;}
【轉】Nodejs學習筆記(一)--- 簡介及安裝Node.js開發環境
ack 目錄 javascrip 難度 時間 網站開發 clas jetbrains 常用 目錄 學習資料 簡介 安裝Node.js npm簡介 開發工具 Sublime Node.js開發環境配置 擴展:安裝多版本管理器 學習資料 1.深入淺出Node.j
【二】遺傳算法(GA)的MATLAB實現
tool view ima baidu ges matlab實現 編程 from 函數調用 essay from:https://wenku.baidu.com/view/ce45bbf44693daef5ef73df3.html 一、MATLAB編程實現GA
P3391 【模板】文藝平衡樹(Splay)
spa 標題 -s gets 需要 () 序列 代碼 輸入 題目背景 這是一道經典的Splay模板題——文藝平衡樹。 題目描述 您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:翻轉一個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2
【51nod1519】拆方塊[Codeforces](dp)
mes str time get view space return .com sed 題目傳送門:1519 拆方塊 首先,我們可以發現,如果第i堆方塊被消除,只有三種情況: 1、第i-1堆方塊全部被消除; 2、第i+1堆方塊全部被消除;(因為兩側的方塊能夠
【bfs】奇怪的電梯(P1135)
site 而且 empty ans 整數 print bsp size col 題目描述 呵呵,有一天我做了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓(1<=i<=N)上有一個數字Ki(0<=Ki<=N)。電梯只有四個