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

GCD介紹(一):基本概念和Dispatch Queue

移動開發 iOS
本文為大家介紹GCD的基本概念和Dispatch Queue。現在你需要知道GCD的基本概念,怎樣創建dispatch queue,怎樣提交Job至dispatch queue以及怎樣將隊列用作線程同步。

[[77402]]

什么是GCD?

Grand Central Dispatch或者GCD,是一套低層API,提供了一種新的方法來進行并發程序編寫。從基本功能上講,GCD有點像NSOperationQueue,他們都允許程序將任務切分為多個單一任務然后提交至工作隊列來并發地或者串行地執行。GCD比之NSOpertionQueue更底層更高效,并且它不是Cocoa框架的一部分。

除了代碼的平行執行能力,GCD還提供高度集成的事件控制系統。可以設置句柄來響應文件描述符、mach ports(Mach port 用于 OS X上的進程間通訊)、進程、計時器、信號、用戶生成事件。這些句柄通過GCD來并發執行。

GCD的API很大程度上基于block,當然,GCD也可以脫離block來使用,比如使用傳統c機制提供函數指針和上下文指針。實踐證明,當配合block使用時,GCD非常簡單易用且能發揮其***能力。

你可以在Mac上敲命令“man dispatch”來獲取GCD的文檔。

為何使用?

GCD提供很多超越傳統多線程編程的優勢:

  1. 易用: GCD比之thread跟簡單易用。由于GCD基于work unit而非像thread那樣基于運算,所以GCD可以控制諸如等待任務結束、監視文件描述符、周期執行代碼以及工作掛起等任務。基于block的血統導致它能極為簡單得在不同代碼作用域之間傳遞上下文。
  2. 效率: GCD被實現得如此輕量和優雅,使得它在很多地方比之專門創建消耗資源的線程更實用且快速。這關系到易用性:導致GCD易用的原因有一部分在于你可以不用擔心太多的效率問題而僅僅使用它就行了。
  3. 性能: GCD自動根據系統負載來增減線程數量,這就減少了上下文切換以及增加了計算效率。

Dispatch Objects

盡管GCD是純c語言的,但它被組建成面向對象的風格。GCD對象被稱為dispatch object。Dispatch object像Cocoa對象一樣是引用計數的。使用dispatch_release和dispatch_retain函數來操作dispatch object的引用計數來進行內存管理。但主意不像Cocoa對象,dispatch object并不參與垃圾回收系統,所以即使開啟了GC,你也必須手動管理GCD對象的內存。

Dispatch queues 和 dispatch sources(后面會介紹到)可以被掛起和恢復,可以有一個相關聯的任意上下文指針,可以有一個相關聯的任務完成觸發函數。可以查閱“man dispatch_object”來獲取這些功能的更多信息。

Dispatch Queues

GCD的基本概念就是dispatch queue。dispatch queue是一個對象,它可以接受任務,并將任務以先到先執行的順序來執行。dispatch queue可以是并發的或串行的。并發任務會像NSOperationQueue那樣基于系統負載來合適地并發進行,串行隊列同一時間只執行單一任務。

GCD中有三種隊列類型:

  1. The main queue: 與主線程功能相同。實際上,提交至main queue的任務會在主線程中執行。main queue可以調用dispatch_get_main_queue()來獲得。因為main queue是與主線程相關的,所以這是一個串行隊列。
  2. Global queues: 全局隊列是并發隊列,并由整個進程共享。進程中存在三個全局隊列:高、中(默認)、低三個優先級隊列。可以調用dispatch_get_global_queue函數傳入優先級來訪問隊列。
  3. 用戶隊列: 用戶隊列 (GCD并不這樣稱呼這種隊列, 但是沒有一個特定的名字來形容這種隊列,所以我們稱其為用戶隊列) 是用函數 dispatch_queue_create 創建的隊列. 這些隊列是串行的。正因為如此,它們可以用來完成同步機制, 有點像傳統線程中的mutex。

創建隊列

要使用用戶隊列,我們首先得創建一個。調用函數dispatch_queue_create就行了。函數的***個參數是一個標簽,這純是為了debug。Apple建議我們使用倒置域名來命名隊列,比如“com.dreamingwish.subsystem.task”。這些名字會在崩潰日志中被顯示出來,也可以被調試器調用,這在調試中會很有用。第二個參數目前還不支持,傳入NULL就行了。

提交 Job

向一個隊列提交Job很簡單:調用dispatch_async函數,傳入一個隊列和一個block。隊列會在輪到這個block執行時執行這個block的代碼。下面的例子是一個在后臺執行一個巨長的任務:

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
  2.         [self goDoSomethingLongAndInvolved]; 
  3.         NSLog(@"Done doing something long and involved"); 
  4. }); 

dispatch_async 函數會立即返回, block會在后臺異步執行。 

當然,通常,任務完成時簡單地NSLog個消息不是個事兒。在典型的Cocoa程序中,你很有可能希望在任務完成時更新界面,這就意味著需要在主線程中執行一些代碼。你可以簡單地完成這個任務——使用嵌套的dispatch,在外層中執行后臺任務,在內層中將任務dispatch到main queue:

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
  2.         [self goDoSomethingLongAndInvolved]; 
  3.         dispatch_async(dispatch_get_main_queue(), ^{ 
  4.             [textField setStringValue:@"Done doing something long and involved"]; 
  5.         }); 
  6. }); 

還有一個函數叫dispatch_sync,它干的事兒和dispatch_async相同,但是它會等待block中的代碼執行完成并返回。結合 __block類型修飾符,可以用來從執行中的block獲取一個值。例如,你可能有一段代碼在后臺執行,而它需要從界面控制層獲取一個值。那么你可以使用dispatch_sync簡單辦到:

  1. __block NSString *stringValue; 
  2. dispatch_sync(dispatch_get_main_queue(), ^{ 
  3.         // __block variables aren't automatically retained 
  4.         // so we'd better make sure we have a reference we can keep 
  5.         stringValue = [[textField stringValue] copy]; 
  6. }); 
  7. [stringValue autorelease]; 
  8. // use stringValue in the background now 

我們還可以使用更好的方法來完成這件事——使用更“異步”的風格。不同于取界面層的值時要阻塞后臺線程,你可以使用嵌套的block來中止后臺線程,然后從主線程中獲取值,然后再將后期處理提交至后臺線程:

  1. dispatch_queue_t bgQueue = myQueue; 
  2.    dispatch_async(dispatch_get_main_queue(), ^{ 
  3.        NSString *stringValue = [[[textField stringValue] copy] autorelease]; 
  4.        dispatch_async(bgQueue, ^{ 
  5.            // use stringValue in the background now 
  6.        }); 
  7.    }); 

取決于你的需求,myQueue可以是用戶隊列也可以使全局隊列。

不再使用鎖(Lock)

用戶隊列可以用于替代鎖來完成同步機制。在傳統多線程編程中,你可能有一個對象要被多個線程使用,你需要一個鎖來保護這個對象:

  1. NSLock *lock; 

訪問代碼會像這樣:

  1. - (id)something 
  2.    { 
  3.        id localSomething; 
  4.        [lock lock]; 
  5.        localSomething = [[something retain] autorelease]; 
  6.        [lock unlock]; 
  7.        return localSomething; 
  8.    } 
  9.  
  10.    - (void)setSomething:(id)newSomething 
  11.    { 
  12.        [lock lock]; 
  13.        if(newSomething != something) 
  14.        { 
  15.            [something release]; 
  16.            something = [newSomething retain]; 
  17.            [self updateSomethingCaches]; 
  18.        } 
  19.        [lock unlock]; 
  20.    } 

使用GCD,可以使用queue來替代:

  1. dispatch_queue_t queue; 

要用于同步機制,queue必須是一個用戶隊列,而非全局隊列,所以使用usingdispatch_queue_create初始化一個。然后可以用dispatch_async 或者 dispatch_sync將共享數據的訪問代碼封裝起來:

  1. - (id)something 
  2.     __block id localSomething; 
  3.     dispatch_sync(queue, ^{ 
  4.         localSomething = [something retain]; 
  5.     }); 
  6.     return [localSomething autorelease]; 
  7.  
  8. - (void)setSomething:(id)newSomething 
  9.     dispatch_async(queue, ^{ 
  10.         if(newSomething != something) 
  11.         { 
  12.             [something release]; 
  13.             something = [newSomething retain]; 
  14.             [self updateSomethingCaches]; 
  15.         } 
  16.     }); 

值得注意的是dispatch queue是非常輕量級的,所以你可以大用特用,就像你以前使用lock一樣。

現在你可能要問:“這樣很好,但是有意思嗎?我就是換了點代碼辦到了同一件事兒。”

實際上,使用GCD途徑有幾個好處:

  1. 平行計算: 注意在第二個版本的代碼中, -setSomething:是怎么使用dispatch_async的。調用 -setSomething:會立即返回,然后這一大堆工作會在后臺執行。如果updateSomethingCaches是一個很費時費力的任務,且調用者將要進行一項處理器高負荷任務,那么這樣做會很棒。
  2. 安全: 使用GCD,我們就不可能意外寫出具有不成對Lock的代碼。在常規Lock代碼中,我們很可能在解鎖之前讓代碼返回了。使用GCD,隊列通常持續運行,你必將歸還控制權。
  3. 控制: 使用GCD我們可以掛起和恢復dispatch queue,而這是基于鎖的方法所不能實現的。我們還可以將一個用戶隊列指向另一個dspatch queue,使得這個用戶隊列繼承那個dispatch queue的屬性。使用這種方法,隊列的優先級可以被調整——通過將該隊列指向一個不同的全局隊列,若有必要的話,這個隊列甚至可以被用來在主線程上執行代碼。
  4. 集成: GCD的事件系統與dispatch queue相集成。對象需要使用的任何事件或者計時器都可以從該對象的隊列中指向,使得這些句柄可以自動在該隊列上執行,從而使得句柄可以與對象自動同步。

總結

現在你已經知道了GCD的基本概念、怎樣創建dispatch queue、怎樣提交Job至dispatch queue以及怎樣將隊列用作線程同步。接下來我會向你展示如何使用GCD來編寫平行執行代碼來充分利用多核系統的性能^ ^。我還會討論GCD更深層的東西,包括事件系統和queue targeting。

責任編輯:閆佳明 來源: dreamingwish
相關推薦

2013-07-15 16:18:08

2010-03-09 13:36:41

Linux基本概念

2009-12-21 10:27:52

WCF基本概念

2009-08-18 10:34:31

Java入門基本概念

2010-06-12 14:12:22

RSVP協議

2010-06-29 13:00:49

EIGRP協議

2010-04-22 12:27:16

Aix操作系統

2010-08-16 16:23:00

Eclipse插件

2010-03-16 14:13:20

無線Mesh網絡

2011-08-22 15:19:25

2011-03-28 11:05:17

ODBC

2013-04-16 10:45:52

Android基本概念

2012-09-11 14:39:03

Moosefs

2009-03-20 11:46:10

MGCP協議網關

2014-04-16 15:11:19

Spark

2010-06-21 18:04:08

2017-07-10 16:40:09

2009-09-07 04:29:28

SDI MDI

2023-06-14 00:21:52

2017-04-07 10:19:22

交易支付概念
點贊
收藏

51CTO技術棧公眾號

国产一区二区三区不卡在线观看| 激情综合网五月| 一区二区三区在线观看欧美| 91精品天堂| www.日本精品| av永久不卡| 日韩一级成人av| 奇米精品一区二区三区| 888av在线| 国产成人aaaa| 国产精品户外野外| 国产成人无码aa精品一区| 午夜先锋成人动漫在线| 欧美色视频在线| 国产www免费| 国产资源在线播放| 国产成人免费av在线| 91av在线国产| 成人免费视频国产免费观看| 奇米777国产一区国产二区| 欧美日韩亚洲高清一区二区| 福利在线一区二区| 国产高清免费av在线| 国产iv一区二区三区| 国产精品久久久久久久久免费看| 欧美日韩中文字幕在线观看 | 亚洲综合在线中文字幕| 精品欧美一区二区三区免费观看 | 日韩一区二区三区四区五区| 亚洲不卡av一区二区三区| 一区二区三区av在线| 日韩大胆人体| 成人午夜激情影院| 国产一区二区丝袜| 国产精品51麻豆cm传媒| 国产精品久久777777毛茸茸| 精品中文字幕乱| 午夜激情福利电影| 九九精品在线| 亚洲国产精品999| 精品国产午夜福利在线观看| 欧美美女被草| 欧美在线free| 国产黄色特级片| 98色花堂精品视频在线观看| 一区二区三区四区蜜桃 | 婷婷中文字幕一区| 国产亚洲成精品久久| 国产黄色三级网站| h视频久久久| 91精品久久久久久久99蜜桃 | 激情综合网五月婷婷| 亚洲成av人片乱码色午夜| 一本一本久久a久久精品综合小说| 亚洲麻豆一区二区三区| 亚洲国产aⅴ精品一区二区| 欧美日韩国产成人在线91| 国产一级不卡毛片| 久久sese| 欧日韩精品视频| www.色偷偷.com| 五月激情久久| 欧美日韩一区二区不卡| 亚洲精品自拍网| 亚洲电影有码| 欧美无乱码久久久免费午夜一区| 黄色av免费在线播放| 欧美极度另类| 在线一区二区视频| 亚洲综合色在线观看| 欧洲午夜精品| 日韩一二三区不卡| 中国免费黄色片| 国产伦精品一区二区三区在线播放| 欧美成人免费网站| 国产精品无码电影| 中文字幕精品影院| 日韩在线视频观看| 欧美激情一区二区视频| 黄色工厂这里只有精品| 26uuu亚洲国产精品| 黄色片视频免费| 久久精品国产久精国产爱| 亚洲在线免费看| 无码精品在线观看| 国产精品嫩草99a| 老司机午夜免费福利视频| 黑人玩欧美人三根一起进| 午夜精品久久久| 999精品网站| 日韩午夜视频在线| 亚洲国产精品久久久久秋霞蜜臀| 久久久亚洲av波多野结衣| 久久一区二区三区喷水| 欧美人交a欧美精品| 国产午夜免费福利| 激情综合五月天| 成人精品久久av网站| 国产香蕉在线观看| 欧美国产精品专区| 国产一二三区在线播放| 欧美人体一区二区三区| 日韩视频在线你懂得| 国产熟妇搡bbbb搡bbbb| 婷婷综合社区| 欧美又大又硬又粗bbbbb| 中文在线免费观看| 不卡视频在线观看| 一区二区日本伦理| 成人性生交大片免费观看网站| 777精品伊人久久久久大香线蕉| 男人的天堂影院| 欧美偷拍自拍| 欧美亚洲日本黄色| wwwav在线播放| 欧美激情一区不卡| 欧美在线观看黄| 日本美女久久| 日韩电视剧在线观看免费网站| 91ts人妖另类精品系列| 久久久国产亚洲精品| 99在线观看视频| 91大神在线网站| 欧美视频第一页| 精品人妻二区中文字幕| 成人精品久久| 日本a级片电影一区二区| 午夜精品一区二区三| 国产精品国产三级国产| 日韩精品一区二区三区久久| 亚洲视频精选| 久久综合五月天| 在线观看免费观看在线| 久久人人超碰精品| 日韩久久一级片| 牛牛视频精品一区二区不卡| 欧美成人一区二区三区电影| 在线免费观看视频网站| 国产午夜三级一区二区三| 女性女同性aⅴ免费观女性恋| 日韩在线观看一区二区三区| 久久精品国产电影| 亚洲天堂999| 国产嫩草影院久久久久| 无码人妻丰满熟妇区毛片| 日韩影视高清在线观看| 亚洲91精品在线观看| 国产精品爽爽久久久久久| 国产精品免费av| 亚洲 激情 在线| 国产韩日影视精品| 国产在线视频不卡| 国产成人在线视频免费观看| 欧美另类高清zo欧美| 亚洲视频重口味| 国产一区二区在线观看免费| 中文精品视频一区二区在线观看| 99久久99九九99九九九| 久久亚洲私人国产精品va| 国产精品视频无码| 一区二区三区小说| 美女搡bbb又爽又猛又黄www| 亚洲久久一区| 欧美日韩一区二区三区在线视频| 成人日韩在线| www亚洲精品| 国产成人精品一区二三区四区五区| 亚洲色图欧美激情| 久久久久久婷婷| 在线亚洲伦理| 亚洲精品一区二区三| 四虎视频在线精品免费网址| 欧美大尺度激情区在线播放| 高潮毛片7777777毛片| 午夜日韩在线电影| 久久久久亚洲av成人无码电影| 麻豆久久久久久久| 成人一级生活片| 久草在线成人| 91精品久久久久久久久久另类 | 国模gogo一区二区大胆私拍| 头脑特工队2免费完整版在线观看| 色综合视频一区二区三区高清| 国产7777777| 国产激情视频一区二区三区欧美 | 日韩国产精品久久| 国产精品99久久久久久大便| 成人av综合网| 国产成人极品视频| 成人直播在线| 日韩二区三区在线| 国产又大又黄的视频| 亚洲午夜影视影院在线观看| 91精彩刺激对白露脸偷拍| 久久国产乱子精品免费女| 超级碰在线观看| 国产一区二区观看| 国产精品国产三级欧美二区| 久久亚洲精品爱爱| 高清欧美性猛交xxxx| 成年人视频免费在线观看| 日韩欧美视频一区| 91porny九色| 午夜影院在线观看欧美| 男人天堂资源网| 91亚洲国产成人精品一区二三| 亚洲欧美国产中文| 国产精品日韩欧美一区| 奇米777四色影视在线看| 国产一区日韩| 国产综合动作在线观看| 91亚洲精品在看在线观看高清| 91精品国产成人www| av片在线观看| 中文字幕在线看视频国产欧美| 男人天堂一区二区| 欧美一区二区精品久久911| 中文字幕一区二区三区四区欧美| 亚洲最大的成人av| 91香蕉视频在线播放| 欧美韩日一区二区三区| 老鸭窝一区二区| www.爱久久.com| 91亚洲一线产区二线产区| 美女视频网站黄色亚洲| 欧美牲交a欧美牲交aⅴ免费真 | 91国视频在线| 激情五月***国产精品| 欧洲金发美女大战黑人| 三级电影一区| 亚洲精品欧洲精品| 欧美日韩国产高清电影| 免费在线成人av电影| 精品精品国产三级a∨在线| 亚洲sss综合天堂久久| 色婷婷成人网| 国产裸体写真av一区二区| 日韩av一级| 国产suv精品一区二区三区88区| 国内激情视频在线观看| 午夜精品久久17c| 超碰在线公开| 欧美一级在线播放| 天堂√8在线中文| 日本aⅴ大伊香蕉精品视频| 国产伦精品一区二区三区视频金莲| 性视频1819p久久| 亚洲私拍视频| 国产极品精品在线观看| 免费观看成人性生生活片| 国产精品99久久久久久人| 欧美黑人粗大| 国产精品网址在线| 婷婷久久免费视频| 114国产精品久久免费观看| 日本一区二区三区播放| 成人av电影免费| 秋霞在线一区| 日韩久久久久久久久久久久久| 国产在线日韩精品| 亚洲精品乱码视频| 你懂的视频一区二区| 黄色激情在线视频| 国产亚洲毛片| 亚洲色图久久久| 国产一区视频网站| 亚洲欧美日韩色| 久久精品夜色噜噜亚洲aⅴ| www.99热| 一区二区三区四区精品在线视频| 免费观看一级视频| 色av一区二区| 91麻豆成人精品国产| 精品少妇一区二区三区视频免付费 | 久久夜色精品国产欧美乱极品| 26uuu国产| 99久久久久久| 我不卡一区二区| 亚洲美女在线一区| 久久99精品波多结衣一区| 欧美吞精做爰啪啪高潮| 亚洲av无码一区二区三区性色| 日韩av在线最新| 乱人伦中文视频在线| 欧美—级a级欧美特级ar全黄| 在线毛片观看| 成人写真视频福利网| 色婷婷综合久久久久久| 中文字幕一区二区三区5566| 激情一区二区| 男人的天堂最新网址| 成人h动漫精品一区二| 粉嫩精品久久99综合一区| 亚洲综合区在线| 精品国产www| 欧美精品一区二区三区四区 | 人妻内射一区二区在线视频 | 亚洲日韩视频| 日本中文字幕精品—区二区| va亚洲va日韩不卡在线观看| 国产一区二区三区视频播放| 亚洲狠狠爱一区二区三区| jizz国产在线观看| 精品久久人人做人人爽| av免费在线一区二区三区| 国模视频一区二区| 99精品女人在线观看免费视频| 欧美激情论坛| 国产精品久久| 久久久精品麻豆| 成人av网址在线| 粉嫩av性色av蜜臀av网站| 在线这里只有精品| 无码国产色欲xxxx视频| 欧美成人高清视频| 丰满少妇一区| 欧洲久久久久久| 亚洲永久网站| 日本天堂在线播放| 亚洲免费三区一区二区| 精品国产www| 国产亚洲精品va在线观看| 国产在线天堂www网在线观看| 99久久精品久久久久久ai换脸| 99久久亚洲精品| 在线观看免费视频高清游戏推荐| 97久久人人超碰| 精品午夜福利在线观看| 欧美一区二区三区电影| 午夜精品一区| 精品一区二区三区欧美| 在线免费一区| 久久先锋影音| 182在线视频| 亚洲v精品v日韩v欧美v专区| 国产高潮在线观看| 日韩在线资源网| 色综合久久中文综合久久牛| 国产精品久久免费| 中文字幕日韩av综合精品| 波多视频一区| 老司机精品福利在线观看| 亚洲激情一区| 中文在线一区二区三区| 精品电影在线观看| 天堂av2024| 7777免费精品视频| 全球av集中精品导航福利| 人妻熟妇乱又伦精品视频| 91丨九色丨尤物| 久久国产黄色片| 亚洲欧美日韩区| 影视一区二区三区| 亚洲欧美成人一区| 韩国毛片一区二区三区| 一区二区三区影视| 日韩精品一区二区在线观看| xxxx视频在线| 久久久影院一区二区三区| 老司机精品视频网站| 精品亚洲aⅴ无码一区二区三区| 欧美性极品少妇| 大地资源网3页在线观看| av观看久久| 久久国产欧美| 欧美a在线播放| 91精品国产综合久久精品app | 久久久精品影院| 精品一区二区三区视频在线播放| 成人毛片100部免费看| 99精品欧美一区二区蜜桃免费 | xxxx在线视频| 日本不卡二区| 国产美女在线精品| 日韩xxx高潮hd| 中国人与牲禽动交精品| 亚洲性视频在线| 久久黄色免费看| 亚洲人成网站色在线观看| 乱色精品无码一区二区国产盗| 日韩av成人在线观看| 99国产**精品****| 少妇精品无码一区二区三区| 色综合 综合色| www.在线视频| 蜜桃麻豆www久久国产精品| 激情亚洲综合在线| 97免费在线观看视频| 久久国内精品一国内精品| 欧美日韩看看2015永久免费| 天堂网在线免费观看| 亚洲成国产人片在线观看| yourporn在线观看中文站| 成人国产一区二区| 日韩黄色在线观看| 国产亚洲精品久久久久久打不开| 国产一区二区三区丝袜| 亚洲精品黑牛一区二区三区| 好男人www社区| 午夜精品爽啪视频|