91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

并發編程中Semaphore的使用方法

發布時間:2021-09-13 09:44:54 來源:億速云 閱讀:150 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關并發編程之Semaphore的使用方法,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

線程去獲取鎖首先查看線程是否有中斷標志,有就拋異常,沒有就嘗試去獲取鎖,代碼如下:
并發編程中Semaphore的使用方法


并發編程中Semaphore的使用方法
如果隊列是空的,獲取當前抽象隊列的state,當前的state-資源數的差值大于0(說明嘗試獲取鎖成功),cas將當前state改成差值,并返回(整個過程自旋+cas保證了嘗試獲取鎖成功并修改state的原子性。);如果隊列有排隊的節點(嘗試獲取鎖失敗返回-1)或者隊列沒有排隊節點但是差值小于0(嘗試獲取鎖失敗,資源數太多)就要入隊,代碼如下:
并發編程中Semaphore的使用方法
并發編程中Semaphore的使用方法
并發編程中Semaphore的使用方法
這里和排他鎖的區別是參數為共享模式,同樣隊列為空就初始化隊列(自旋+cas保證了初始化隊列的原子性),不為空就入隊。判斷當前節點的前節點是否是head節點,如果是,再次嘗試獲取鎖,如果失敗,或者當前節點的前節點不是head就將前節點的ws改為-1,阻塞當前線程park。
如果有線程釋放鎖,代碼如下:
并發編程中Semaphore的使用方法
嘗試釋放共享鎖,代碼如下:
并發編程中Semaphore的使用方法
獲取抽象隊列的state,將state+1(不一定為+1)的和,cas將state修改成和,嘗試釋放鎖成功。喚醒后續節點,代碼如下:
并發編程中Semaphore的使用方法
喚醒頭節點把頭節點的ws=-1,將其修改為0,然后喚醒,代碼如下:
并發編程中Semaphore的使用方法
如果頭節點的ws=-1<0將其cas為0,下一個節點不為空,unpark(下一節點的線程),線程在阻塞的位置被喚醒,嘗試獲取鎖,代碼如下:
并發編程中Semaphore的使用方法
在循環中被喚醒,繼續嘗試獲取鎖,如果和上一次一樣失敗,則繼續park阻塞。嘗試獲取鎖成功int r = tryAcquireShared(arg)>=0,代碼如下:
并發編程中Semaphore的使用方法
將當前節點設置為head(head=當前節點,當前節點的pre=null,thread=null)意味著前節點要被踢出隊列(差一步修改前節點的next=null),當前節點下一節點為空,將前節點的next=null,前節點出隊完成,獲取鎖成功;
反之下一節點不為空(下一節點會在阻塞park前將前節點的ws=-1)并且為共享模式釋放鎖,代碼如下:
并發編程中Semaphore的使用方法
這里會將新的頭節點的ws=-1改為0,喚醒下一節點,代碼如下:
并發編程中Semaphore的使用方法
喚醒下一線程,下一線程在阻塞的循環中被喚醒,嘗試獲取鎖,失敗再次阻塞park,成功就繼續這一步驟,一直傳播下去,也就是喚醒多個節點

上述就是小編為大家分享的并發編程之Semaphore的使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新河县| 尚志市| 安阳县| 镇原县| 黔南| 桂东县| 江孜县| 建始县| 新沂市| 黄陵县| 淮滨县| 保定市| 陆丰市| 临沭县| 昆明市| 杭锦旗| 江陵县| 射洪县| 房山区| 青州市| 大埔县| 云南省| 开阳县| 萨嘎县| 施秉县| 禄丰县| 岳阳县| 友谊县| 石城县| 邢台县| 灵石县| 奇台县| 稻城县| 德州市| 东乡族自治县| 莱州市| 阿鲁科尔沁旗| 额尔古纳市| 平阳县| 绥江县| 新疆|