精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Libtask源碼解析之鎖

開發 前端
libtask中其實不需要鎖,因為libtask中協程是非搶占式的,不存在競態條件。但是libtask還是實現了一套鎖的機制。我們看一下這個鎖機制的實現。首先我們看一下結構體。

[[382302]]

本文轉載自微信公眾號「編程雜技」,作者theanarkh 。轉載本文請聯系編程雜技公眾號。  

 libtask中其實不需要鎖,因為libtask中協程是非搶占式的,不存在競態條件。但是libtask還是實現了一套鎖的機制。我們看一下這個鎖機制的實現。首先我們看一下結構體。

  1. struct QLock 
  2.     // 鎖持有者 
  3.     Task    *owner; 
  4.     // 等待該鎖的隊列 
  5.     Tasklist waiting; 
  6. }; 

接著我們看一下鎖的操作。

加鎖

  1. static int _qlock(QLock *l, int block) 
  2. {     
  3.     // 鎖沒有持有者,則置當前協程為持有者,直接返回,1表示加鎖成功 
  4.     if(l->owner == nil){ 
  5.         l->owner = taskrunning; 
  6.         return 1; 
  7.     } 
  8.     // 非阻塞,則直接返回,0表示加鎖失敗 
  9.     if(!block) 
  10.         return 0; 
  11.     // 插入等待鎖隊列 
  12.     addtask(&l->waiting, taskrunning); 
  13.     taskstate("qlock"); 
  14.     // 切換到其他協程 
  15.     taskswitch(); 
  16.     // 切換回來時,如果持有鎖的協程不是當前協程,則異常退出,因為只有持有鎖才會被切換回來,見unqlock 
  17.     if(l->owner != taskrunning){ 
  18.         fprint(2, "qlock: owner=%p self=%p oops\n", l->owner, taskrunning); 
  19.         abort(); 
  20.     } 
  21.     return 1; 

如果當前鎖沒有持有者,則當前協程X就變成鎖的持有者,否則把協程X插入等待鎖隊列中,然后讓出cpu,切換到其他協程。當后續鎖被釋放并被協程X持有時,協程X就會被喚醒繼續持續。加鎖可以分為阻塞和非阻塞兩種模式。非阻塞就是加鎖失敗也不會切換協程。

  1. // 阻塞式加鎖 
  2. void qlock(QLock *l) 
  3.     _qlock(l, 1); 
  4.  
  5. // 非阻塞式加鎖 
  6. int 
  7. canqlock(QLock *l) 
  8.     return _qlock(l, 0); 

釋放鎖

接下來我們看一下釋放鎖的邏輯

  1. // 釋放鎖 
  2. void qunlock(QLock *l) 
  3.     Task *ready; 
  4.     // 鎖并沒有持有者,異常退出 
  5.     if(l->owner == 0){ 
  6.         fprint(2, "qunlock: owner=0\n"); 
  7.         abort(); 
  8.     } 
  9.     // 如果還有協程在等待該鎖,則置為持有者,并且從等待隊列中刪除,然后修改狀態為就緒并加入就緒隊列 
  10.     if((l->owner = ready = l->waiting.head) != nil){ 
  11.         deltask(&l->waiting, ready); 
  12.         taskready(ready); 
  13.     } 

當鎖被釋放時,如果還有協程在等待該鎖,則從等待隊列中摘取一個節點,然后變成鎖的持有者并從等待隊列中刪除。最后插入就緒隊列等待調度。以上是一種互斥鎖的實現。下面我們再來看一下讀寫鎖機制,讀寫鎖也是互斥的,但是在某些情況下也可以共享。我們看一下讀寫鎖的數據結構。

  1. struct RWLock 
  2.     // 正在讀的讀者個數 
  3.     int    readers; 
  4.     // 當前正在寫的寫者,只有一個 
  5.     Task    *writer; 
  6.     // 等待讀和寫的隊列 
  7.     Tasklist rwaiting; 
  8.     Tasklist wwaiting; 
  9. }; 

接著我看一下加鎖邏輯。

加讀鎖

  1. // 加讀鎖 
  2. static int _rlock(RWLock *l, int block) 
  3. {     
  4.     /* 
  5.         沒有正在寫并且沒有等待寫,則加鎖成功,并且讀者數加一 
  6.     */ 
  7.     if(l->writer == nil && l->wwaiting.head == nil){ 
  8.         l->readers++; 
  9.         return 1; 
  10.     } 
  11.     // 非阻塞則直接返回 
  12.     if(!block) 
  13.         return 0; 
  14.     // 插入等待讀隊列 
  15.     addtask(&l->rwaiting, taskrunning); 
  16.     taskstate("rlock"); 
  17.     // 切換上下文 
  18.     taskswitch(); 
  19.     // 切換回來了,說明加鎖成功 
  20.     return 1; 

當且僅當沒有正在寫的寫者和等待寫的寫者時,才能加讀鎖成功,否則根據加鎖模式進行下一步處理,直接返回加鎖失敗或者插入等待隊列,然后切換到其他協程。我們看到當有一個等待寫的協程時(l->wwaiting.head != nil),則后續的讀者就無法加鎖成功,而是被插入等待隊列,否則可能會引起寫者饑餓。

加寫鎖

  1. // 加寫鎖 
  2. static int _wlock(RWLock *l, int block) 
  3. {     
  4.     // 沒有正在寫并且沒有正在讀,則加鎖成功,并置寫者為當前協程 
  5.     if(l->writer == nil && l->readers == 0){ 
  6.         l->writer = taskrunning; 
  7.         return 1; 
  8.     } 
  9.     // 非阻塞則直接返回 
  10.     if(!block) 
  11.         return 0; 
  12.     // 加入等待寫隊列 
  13.     addtask(&l->wwaiting, taskrunning); 
  14.     taskstate("wlock"); 
  15.     // 切換 
  16.     taskswitch(); 
  17.     // 切換回來說明拿到鎖了 
  18.     return 1; 

當且僅當沒有正在寫的寫者和沒有正在讀的讀者時,才能加寫鎖成功。否則類似加讀鎖一樣處理。

釋放讀鎖

  1. // 釋放讀鎖 
  2. void runlock(RWLock *l) 
  3.     Task *t; 
  4.     // 讀者減一,如果等于0并且有等待寫的協程,則隊列第一個協程持有該鎖 
  5.     if(--l->readers == 0 && (t = l->wwaiting.head) != nil){ 
  6.         deltask(&l->wwaiting, t); 
  7.         l->writer = t; 
  8.         taskready(t); 
  9.     } 

持有讀鎖,說明當前肯定沒有正在寫的寫者,但是可能有等待寫的寫者和等待讀的讀者(因為有等待寫的寫者導致無法加鎖成功)。當釋放讀鎖時,如果還有其他讀者,則其他讀者可以繼續持有鎖,因為讀者可以共享讀鎖,而寫者保持原來狀態。如果這時候沒有讀者但是有等待寫的寫者,則從隊列中選擇第一個節點成為鎖的持有者,其他的寫者則繼續等待,因為寫者不能共享寫鎖。

釋放寫鎖

  1. // 釋放寫鎖 
  2. void wunlock(RWLock *l) 
  3.     Task *t; 
  4.     // 沒有正在寫,異常退出 
  5.     if(l->writer == nil){ 
  6.         fprint(2, "wunlock: not locked\n"); 
  7.         abort(); 
  8.     } 
  9.     // 置空,沒有協程正在寫 
  10.     l->writer = nil; 
  11.     // 有正在讀,異常退出,寫的時候,是無法讀的 
  12.     if(l->readers != 0){ 
  13.         fprint(2, "wunlock: readers\n"); 
  14.         abort(); 
  15.     } 
  16.     // 釋放寫鎖時,優先讓讀者持有鎖,因為讀者可以共享持有鎖,提高并發 
  17.     // 讀可以共享,把等待讀的協程都加入就緒隊列,并持有鎖 
  18.     while((t = l->rwaiting.head) != nil){ 
  19.         deltask(&l->rwaiting, t); 
  20.         l->readers++; 
  21.         taskready(t); 
  22.     } 
  23.     // 釋放寫鎖時,如果又沒有讀者,并且有等待寫的協程,則隊列的第一個等待寫的協程持有鎖 
  24.     if(l->readers == 0 && (t = l->wwaiting.head) != nil){ 
  25.         deltask(&l->wwaiting, t); 
  26.         l->writer = t; 
  27.         taskready(t); 
  28.     } 

持有寫鎖,可能有等待寫的寫者和等待讀的讀者。這里是讀者優先持有鎖,因為讀者可以共享持有鎖,提高并發,如果沒有讀者,則再判斷寫者。

總結:單純的互斥鎖是比較簡單的,讀寫鎖就相對復雜一點,主要是要根據讀鎖和寫鎖的特性制定一些策略,比如避免饑餓問題。libtask的方式是,加寫鎖的時候,當無法持有鎖的時候,申請者就會被插入等待等待隊列。這個是沒有什么好說的,加讀者的時候,情況就復雜了點,如果這時候有讀者正在持有鎖,理論上,申請者也可以持有鎖,因為讀鎖是共享的,但是單純這樣處理的話,可能會導致等待寫的寫者一直拿不到鎖,所以這里需要判斷是否有等待寫的寫者,如果有則當前申請者則不能再持有讀鎖,而是要加入等待隊列。那么在釋放鎖的時候,當釋放讀鎖時,優先讓等待寫的寫者持有鎖,再到等待讀的讀者持有鎖。同樣,當釋放寫鎖時,優先讓讀者持有鎖,這樣就能比較好地平衡讀者和寫者持有鎖的機會。

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2021-02-19 06:56:33

架構協程應用

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-06-30 14:56:12

Redisson分布式公平鎖

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-12-07 08:02:43

Spring流程IOC

2021-07-01 09:42:08

Redisson分布式

2022-08-08 08:03:44

MySQL數據庫CBO

2016-09-20 10:15:49

LaravelPHPContainer

2016-09-20 10:26:25

LaravelPHPMiddleware

2022-05-17 10:42:36

reboot源碼解析

2021-07-03 17:45:57

分布式Redisson MultiLock

2011-06-23 15:32:05

Qt Windows消息

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2023-03-17 07:53:20

K8sAPIServerKubernetes

2021-12-08 15:07:51

鴻蒙HarmonyOS應用

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙
點贊
收藏

51CTO技術棧公眾號

久99久精品视频免费观看| 亚洲人成精品久久久 | 日韩不卡一区二区| 日韩中文字幕精品视频| 在线一区二区不卡| 大香伊人中文字幕精品| 97精品久久久午夜一区二区三区 | 亚洲图片在线视频| 999国产精品视频| 亚洲国产91精品在线观看| 久久久久久香蕉| 伊人春色在线观看| 91首页免费视频| 成人精品aaaa网站| 精品在线播放视频| 国产精品成人a在线观看| 精品国产青草久久久久福利| www.99av.com| а√天堂8资源在线| 国产精品不卡在线| 国产一区二区三区奇米久涩| 中文字幕永久免费视频| 欧美激情精品久久久六区热门| 在线免费观看视频| 亚洲欧美日韩在线高清直播| 国产精品jizz视频| 国产一区二区视频免费在线观看 | 国产一区二区精品久久| 欧美中文字幕精品| 九九视频免费在线观看| 秋霞欧美视频| 国产视频精品一区二区三区| 97超碰免费在线观看| 精品三区视频| 精品国产成人av| japanese在线播放| 在线国产91| 久久久亚洲综合| 国产三级精品在线不卡| 精品国产av一区二区三区| 日韩va欧美va亚洲va久久| 68精品国产免费久久久久久婷婷| 国产探花在线播放| 色999日韩| 中文日韩在线视频| av女人的天堂| 免费黄色成人| 亚洲精品一区二区三区婷婷月| 稀缺呦国内精品呦| 欧美成人精品午夜一区二区| 欧美日韩大陆一区二区| 性刺激的欧美三级视频| 日韩网站中文字幕| 一本一本久久a久久精品综合麻豆| 被灌满精子的波多野结衣| 在线网址91| 亚洲一区二区三区视频在线播放 | 国内揄拍国内精品久久| 欧美成人全部免费| 强乱中文字幕av一区乱码| 永久亚洲成a人片777777| 欧美精品一区三区| 免费中文字幕在线观看| 国产精品啊啊啊| 欧美肥婆姓交大片| 黄色小视频在线免费看| 精品白丝av| 69久久夜色精品国产69乱青草| 青青草成人av| 模特精品在线| 国产精品久久精品| 国产精品一区二区av白丝下载 | 亚洲麻豆一区二区三区| 精品国产影院| 亚洲精品影视在线观看| 亚洲国产av一区| 日韩一区电影| 欧美成人精品h版在线观看| 久久久久成人精品无码| 99热精品在线| 国产精品流白浆视频| 国产精品久久久久久69| 国产成人综合在线观看| 国产伦精品一区二区三区在线 | 伊人久久久久久久久久久久| 美国十次了思思久久精品导航| 成人日韩在线电影| 欧美一区二区公司| 国产色综合久久| 特级黄色录像片| 草草视频在线| 欧美日韩免费观看一区二区三区| 精品国产乱码久久久久久1区二区| 91精品国产自产在线丝袜啪| 日韩精品视频在线免费观看 | 欧美3p在线观看| 欧美激情一区二区三区高清视频| 久久精品一二区| 捆绑紧缚一区二区三区视频| 国产美女精品在线观看| 国产一区二区三区不卡在线| 亚洲激情校园春色| 免费在线观看毛片网站| 欧美高清一级片| 亚洲精品中文字幕av| 亚洲怡红院在线观看| 国产情侣一区| 亚洲影院色无极综合| 无码精品一区二区三区在线| 国产精品久久久久9999吃药| 99精品人妻少妇一区二区| 99久久999| 亚洲欧洲日本专区| 久久久久亚洲AV| 免费人成在线不卡| 久久精品日产第一区二区三区| 无遮挡动作视频在线观看免费入口| 亚洲国产精品久久人人爱| 高清av免费看| 中文字幕av一区二区三区人| 欧美精品久久久久久久| 亚洲自拍第二页| 91美女片黄在线观看91美女| 国产专区在线视频| 欧美国产视频| 亚洲人成电影网站色xx| 国产精品第二十页| 国内精品视频666| 日韩亚洲不卡在线| 波多野结衣亚洲| 亚洲精品在线电影| 欧美性猛交xxxxx少妇| 蜜桃精品在线观看| 日本高清不卡三区| 国产传媒在线| 亚洲国产精品中文| 国产一级一片免费播放放a| 国产一区二区三区精品视频| 艳色歌舞团一区二区三区| 色豆豆成人网| 亚洲欧洲xxxx| 日韩精品在线一区二区三区| 久久伊99综合婷婷久久伊| 人妻少妇精品久久| av成人资源| 久久97久久97精品免视看 | 在线成人av观看| 亚洲成人网av| 日韩福利片在线观看| 成人中文字幕合集| 屁屁影院ccyy国产第一页| 欧美另类中文字幕| 欧美猛男性生活免费| 99视频在线观看免费| 亚洲日本在线视频观看| 久久精品免费网站| 精品国产一区二区三区四区| 国产成人精品视频在线观看| 加勒比一区二区三区在线| 色中色一区二区| 国产又黄又粗视频| 男女男精品视频网| 亚洲图片在线观看| 成人黄色理论片| 美女av一区二区| 亚洲黄色小说网址| 午夜伊人狠狠久久| 亚洲午夜久久久久久久久红桃| 美日韩精品视频| 日韩欧美亚洲在线| 香蕉久久久久久| 欧美大片欧美激情性色a∨久久| 亚洲精品国产suv一区| 亚洲国产婷婷综合在线精品| 性欧美成人播放77777| 日韩高清在线不卡| 中文字幕av导航| 国产精品色呦| 国产成人精品久久久| 老司机精品视频在线观看6| 日韩久久精品一区| 国语对白永久免费| 国产精品第五页| 精品久久久久久无码人妻| 亚洲中字黄色| 一区不卡字幕| 久草精品视频| 国产日韩精品在线| segui88久久综合9999| 中文字幕免费精品一区| 亚洲av少妇一区二区在线观看| 疯狂做受xxxx高潮欧美日本| 人妻互换一区二区激情偷拍| 懂色中文一区二区在线播放| 欧美成人黑人猛交| 欧美在线视屏| 欧美日韩一区在线观看视频| 国产亚洲精aa在线看| 4438全国成人免费| 麻豆av在线免费看| 国产视频精品一区二区三区| 99这里有精品视频| 91搞黄在线观看| 国产一级av毛片| 国产精品久久久久久久久果冻传媒 | 精品国产成人在线影院| 美女黄页在线观看| 亚洲成a人片综合在线| 五月婷婷六月香| 91原创在线视频| 日韩精品视频网址| 日本欧美一区二区| 亚洲熟妇国产熟妇肥婆| 亚洲成人免费| 亚洲自拍的二区三区| 亚洲图片久久| 国产精品入口免费| 91麻豆精品国产综合久久久 | 色哟哟精品视频| 亚洲深夜av| 成人在线视频一区二区三区| 国产精品88久久久久久| 欧美激情论坛| 欧美a一欧美| 国产福利久久| 日韩三级av高清片| 91精品中文在线| 国产精品99| 国产精品国产亚洲伊人久久| 蜜桃麻豆av在线| 高清视频欧美一级| 免费在线看电影| 欧美情侣性视频| www久久日com| 欧美成人精品一区二区三区| 麻豆传媒视频在线观看免费| 色偷偷9999www| 欧美一区二区三区在线观看免费| 伊人久久五月天| 国产精品麻豆一区二区三区| 亚洲人成77777在线观看网| 亚洲欧美色视频| 亚洲国产成人一区| 污污视频在线免费看| 亚洲精品ady| 天堂成人在线观看| 日韩av在线不卡| 天天综合网在线| 亚洲精品美女在线观看| 亚洲色偷精品一区二区三区| 亚洲黄色在线看| 香蕉视频免费在线看| 亚洲精品电影网在线观看| 日本人妻熟妇久久久久久| 亚洲精品在线电影| 五月天丁香视频| 亚洲欧美激情一区| aaa在线观看| 久久精品国产成人精品| 99自拍视频在线观看| 欧美高清不卡在线| ririsao久久精品一区| 国产91av在线| 久久免费影院| 2019国产精品视频| 成人av综合网| 免费av在线一区二区| 精品国产日韩欧美| 潘金莲一级淫片aaaaa免费看| 你懂的亚洲视频| 亚洲色成人一区二区三区小说| 久久中文在线| 男人的天堂最新网址| 国产福利一区二区三区视频在线| 亚洲婷婷在线观看| 国产亚洲综合色| 疯狂撞击丝袜人妻| 亚洲自拍偷拍麻豆| www.国产一区二区| 欧美男人的天堂一二区| www.亚洲黄色| 亚洲视频第一页| 免费在线看黄色| 国内精品小视频在线观看| 日韩久久一区二区三区| 91色精品视频在线| 欧美高清视频看片在线观看| 神马影院我不卡午夜| 欧美人成网站| 国产激情在线观看视频| 国产久卡久卡久卡久卡视频精品| 亚洲av无码一区二区三区网址| 亚洲国产精品t66y| 久久久国产精品人人片| 欧美专区日韩专区| 成人黄色在线观看视频| 国产亚洲福利一区| 色www永久免费视频首页在线| 国产91在线播放| 日韩中文字幕视频网| 日韩在线观看电影完整版高清免费| 真实国产乱子伦精品一区二区三区| 黄色动漫在线免费看| 精品一区二区三区在线观看 | 欧洲精品久久久| 日韩一区二区三区精品| 日韩中文字幕av在线| 亚洲国产美女| 欧美性猛交xxxx乱大交91| 久久精品日产第一区二区三区高清版 | 偷拍亚洲色图| 日本香蕉视频在线观看| 美女视频一区二区| 一级黄色片大全| 亚洲第一成年网| 国产免费久久久| 在线精品播放av| 91精品论坛| 精品国产乱码久久久久久丨区2区| 97精品一区二区| 手机看片福利日韩| 久久综合av免费| 日本一级黄色录像| 欧美r级在线观看| 99久久精品免费观看国产| 国产精品入口夜色视频大尺度| 综合伊思人在钱三区| 青青草视频在线免费播放| 国产福利一区在线| 成年人一级黄色片| 欧美精三区欧美精三区| a视频网址在线观看| 日本欧美一级片| 日韩a级大片| 日韩av三级在线| 91一区二区三区在线观看| 国产精品第一页在线观看| 欧美精品一区二区三区蜜桃视频| 菠萝菠萝蜜在线视频免费观看| 成人性生交xxxxx网站| 999国产精品999久久久久久| 九九九九九国产| 国产精品久久福利| 亚洲视频在线观看免费视频| 在线观看中文字幕亚洲| 巨胸喷奶水www久久久免费动漫| 日韩中文字幕一区二区| 美女网站一区二区| a资源在线观看| 欧美日本国产视频| 麻豆影视在线观看_| 成人免费视频a| 综合色一区二区| 深夜视频在线观看| 亚洲一区二区免费视频| 欧美 日韩 中文字幕| 992tv在线成人免费观看| 天堂资源在线亚洲| 日本xxxxxxx免费视频| 中文字幕第一区| 国产一区二区在线视频观看| 欧美成年人网站| 国内精品麻豆美女在线播放视频 | 国产999精品久久| 久久精品视频9| 日韩精品视频免费专区在线播放 | 欧美不卡在线一区二区三区| 天堂蜜桃一区二区三区 | 色播色播色播色播色播在线| 国产不卡一区二区在线播放| 欧美限制电影| 日本黄色www| 欧美日韩精品中文字幕| 91在线导航| 99久热re在线精品视频| 国产欧美日本| 99国产精品无码| 日韩欧美123| 久久电影tv| 神马午夜伦理影院| 99re热这里只有精品免费视频| 成人黄色三级视频| 欧美成人黄色小视频| 亚洲尤物av| 91精产国品一二三产区别沈先生| 亚洲国产精品久久久久秋霞影院 | 亚洲 激情 在线| 夜夜嗨av一区二区三区网页| 日本a一级在线免费播放| 成人妇女免费播放久久久| 亚洲精品一级| 欧美一区二区三区观看| 欧美精品一区二区久久久| 日本欧美不卡| 人妻少妇精品无码专区二区| 国产精品美女久久久久久久| 欧美在线 | 亚洲| 91精品中文在线| 日日夜夜精品视频天天综合网| www.99re7|