国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

GCD介紹(四):完結(jié)

移動(dòng)開(kāi)發(fā) iOS
本文為大家介紹了dispatch queue的掛起、恢復(fù)和目標(biāo)重定,以及這些功能的一些用途。另外,我們還介紹了如何使用dispatch 信號(hào)量和單次初始化功能。到此,我已經(jīng)完成了GCD如何運(yùn)作以及如何使用的介紹。

[[77417]]

Dispatch Queue掛起

dispatch queue可以被掛起和恢復(fù)。使用 dispatch_suspend函數(shù)來(lái)掛起,使用  dispatch_resume 函數(shù)來(lái)恢復(fù)。這兩個(gè)函數(shù)的行為是如你所愿的。另外,這兩個(gè)函數(shù)也可以用于dispatch source。

一個(gè)要注意的地方是,dispatch queue的掛起是block粒度的。換句話(huà)說(shuō),掛起一個(gè)queue并不會(huì)將當(dāng)前正在執(zhí)行的block掛起。它會(huì)允許當(dāng)前執(zhí)行的block執(zhí)行完畢,然后后續(xù)的block不再會(huì)被執(zhí)行,直至queue被恢復(fù)。

還有一個(gè)注意點(diǎn):從man頁(yè)上得來(lái)的:如果你掛起了一個(gè)queue或者source,那么銷(xiāo)毀它之前,必須先對(duì)其進(jìn)行恢復(fù)。

Dispatch Queue目標(biāo)指定

所有的用戶(hù)隊(duì)列都有一個(gè)目標(biāo)隊(duì)列概念。從本質(zhì)上講,一個(gè)用戶(hù)隊(duì)列實(shí)際上是不執(zhí)行任何任務(wù)的,但是它會(huì)將任務(wù)傳遞給它的目標(biāo)隊(duì)列來(lái)執(zhí)行。通常,目標(biāo)隊(duì)列是默認(rèn)優(yōu)先級(jí)的全局隊(duì)列。

用戶(hù)隊(duì)列的目標(biāo)隊(duì)列可以用函數(shù) dispatch_set_target_queue來(lái)修改。我們可以將任意dispatch queue傳遞給這個(gè)函數(shù),甚至可以是另一個(gè)用戶(hù)隊(duì)列,只要?jiǎng)e構(gòu)成循環(huán)就行。這個(gè)函數(shù)可以用來(lái)設(shè)定用戶(hù)隊(duì)列的優(yōu)先級(jí)。比如我們可以將用戶(hù)隊(duì)列的目標(biāo)隊(duì)列設(shè)定為低優(yōu)先級(jí)的全局隊(duì)列,那么我們的用戶(hù)隊(duì)列中的任務(wù)都會(huì)以低優(yōu)先級(jí)執(zhí)行。高優(yōu)先級(jí)也是一樣道理。

有一個(gè)用途,是將用戶(hù)隊(duì)列的目標(biāo)定為main queue。這會(huì)導(dǎo)致所有提交到該用戶(hù)隊(duì)列的block在主線(xiàn)程中執(zhí)行。這樣做來(lái)替代直接在主線(xiàn)程中執(zhí)行代碼的好處在于,我們的用戶(hù)隊(duì)列可以單獨(dú)地被掛起和恢復(fù),還可以被重定目標(biāo)至一個(gè)全局隊(duì)列,然后所有的block會(huì)變成在全局隊(duì)列上執(zhí)行(只要你確保你的代碼離開(kāi)主線(xiàn)程不會(huì)有問(wèn)題)。

還有一個(gè)用途,是將一個(gè)用戶(hù)隊(duì)列的目標(biāo)隊(duì)列指定為另一個(gè)用戶(hù)隊(duì)列。這樣做可以強(qiáng)制多個(gè)隊(duì)列相互協(xié)調(diào)地串行執(zhí)行,這樣足以構(gòu)建一組隊(duì)列,通過(guò)掛起和暫停那個(gè)目標(biāo)隊(duì)列,我們可以?huà)炱鸷蜁和U麄€(gè)組。想象這樣一個(gè)程序:它掃描一組目錄并且加載目錄中的內(nèi)容。為了避免磁盤(pán)競(jìng)爭(zhēng),我們要確定在同一個(gè)物理磁盤(pán)上同時(shí)只有一個(gè)文件加載任務(wù)在執(zhí)行。而希望可以同時(shí)從不同的物理磁盤(pán)上讀取多個(gè)文件。要實(shí)現(xiàn)這個(gè),我們要做的就是創(chuàng)建一個(gè)dispatch queue結(jié)構(gòu),該結(jié)構(gòu)為磁盤(pán)結(jié)構(gòu)的鏡像。

首先,我們會(huì)掃描系統(tǒng)并找到各個(gè)磁盤(pán),為每個(gè)磁盤(pán)創(chuàng)建一個(gè)用戶(hù)隊(duì)列。然后掃描文件系統(tǒng),并為每個(gè)文件系統(tǒng)創(chuàng)建一個(gè)用戶(hù)隊(duì)列,將這些用戶(hù)隊(duì)列的目標(biāo)隊(duì)列指向合適的磁盤(pán)用戶(hù)隊(duì)列。最后,每個(gè)目錄掃描器有自己的隊(duì)列,其目標(biāo)隊(duì)列指向目錄所在的文件系統(tǒng)的隊(duì)列。目錄掃描器枚舉自己的目錄并為每個(gè)文件向自己的隊(duì)列提交一個(gè)block。由于整個(gè)系統(tǒng)的建立方式,就使得每個(gè)物理磁盤(pán)被串行訪問(wèn),而多個(gè)物理磁盤(pán)被并行訪問(wèn)。除了隊(duì)列初始化過(guò)程,我們根本不需要手動(dòng)干預(yù)什么東西。

信號(hào)量

dispatch的信號(hào)量是像其他的信號(hào)量一樣的,如果你熟悉其他多線(xiàn)程系統(tǒng)中的信號(hào)量,那么這一節(jié)的東西再好理解不過(guò)了。

信號(hào)量是一個(gè)整形值并且具有一個(gè)初始計(jì)數(shù)值,并且支持兩個(gè)操作:信號(hào)通知和等待。當(dāng)一個(gè)信號(hào)量被信號(hào)通知,其計(jì)數(shù)會(huì)被增加。當(dāng)一個(gè)線(xiàn)程在一個(gè)信號(hào)量上等待時(shí),線(xiàn)程會(huì)被阻塞(如果有必要的話(huà)),直至計(jì)數(shù)器大于零,然后線(xiàn)程會(huì)減少這個(gè)計(jì)數(shù)。

我們使用函數(shù)  dispatch_semaphore_create 來(lái)創(chuàng)建dispatch信號(hào)量,使用函數(shù)  dispatch_semaphore_signal 來(lái)信號(hào)通知,使用函數(shù) dispatch_semaphore_wait 來(lái)等待。這些函數(shù)的man頁(yè)有兩個(gè)很好的例子,展示了怎樣使用信號(hào)量來(lái)同步任務(wù)和有限資源訪問(wèn)控制。

單次初始化

GCD還提供單詞初始化支持,這個(gè)與pthread中的函數(shù)  pthread_once 很相似。GCD提供的方式的優(yōu)點(diǎn)在于它使用block而非函數(shù)指針,這就允許更自然的代碼方式:

這個(gè)特性的主要用途是惰性單例初始化或者其他的線(xiàn)程安全數(shù)據(jù)共享。典型的單例初始化技術(shù)看起來(lái)像這樣(線(xiàn)程安全的):

  1. + (id)sharedWhatever 
  2.     static Whatever *whatever = nil; 
  3.     @synchronized([Whatever class]) 
  4.     { 
  5.         if(!whatever) 
  6.             whatever = [[Whatever alloc] init]; 
  7.     } 
  8.     return whatever; 

這挺好的,但是代價(jià)比較昂貴;每次調(diào)用  +sharedWhatever 函數(shù)都會(huì)付出取鎖的代價(jià),即使這個(gè)鎖只需要進(jìn)行一次。確實(shí)有更風(fēng)騷的方式來(lái)實(shí)現(xiàn)這個(gè),使用類(lèi)似雙向鎖或者是原子操作的東西,但是這樣挺難弄而且容易出錯(cuò)。

使用GCD,我們可以這樣重寫(xiě)上面的方法,使用函數(shù) dispatch_once

  1. + (id)sharedWhatever 
  2.     static dispatch_once_t pred; 
  3.     static Whatever *whatever = nil; 
  4.     dispatch_once(&pred, ^{ 
  5.         whatever = [[Whatever alloc] init]; 
  6.     }); 
  7.     return whatever; 

這個(gè)稍微比 @synchronized方法簡(jiǎn)單些,并且GCD確保以更快的方式完成這些檢測(cè),它保證block中的代碼在任何線(xiàn)程通過(guò)  dispatch_once 調(diào)用之前被執(zhí)行,但它不會(huì)強(qiáng)制每次調(diào)用這個(gè)函數(shù)都讓代碼進(jìn)行同步控制。實(shí)際上,如果你去看這個(gè)函數(shù)所在的頭文件,你會(huì)發(fā)現(xiàn)目前它的實(shí)現(xiàn)其實(shí)是一個(gè)宏,進(jìn)行了內(nèi)聯(lián)的初始化測(cè)試,這意味著通常情況下,你不用付出函數(shù)調(diào)用的負(fù)載代價(jià),并且會(huì)有更少的同步控制負(fù)載。

結(jié)論

這一章,我們介紹了dispatch queue的掛起、恢復(fù)和目標(biāo)重定,以及這些功能的一些用途。另外,我們還介紹了如何使用dispatch 信號(hào)量和單次初始化功能。到此,我已經(jīng)完成了GCD如何運(yùn)作以及如何使用的介紹。

責(zé)任編輯:閆佳明 來(lái)源: dreamingwish
相關(guān)推薦

2013-07-15 16:18:08

2013-07-15 16:00:59

2013-07-15 15:51:32

iOS多線(xiàn)程GCD基本概念Dispatch Qu

2013-07-15 15:23:03

iOS多線(xiàn)程GCD

2019-05-07 15:38:48

手機(jī)CPU大小核

2023-02-21 16:46:04

loongarch架構(gòu)

2010-03-04 13:54:39

Linux壓縮命令

2013-07-15 16:55:54

iOS多線(xiàn)程GCD實(shí)戰(zhàn)資源競(jìng)爭(zhēng)

2011-06-24 10:53:14

四處一詞SEO

2010-03-05 11:58:52

2013-07-19 14:35:59

iOS中BlockiOS開(kāi)發(fā)學(xué)習(xí)

2010-06-12 18:12:34

UML類(lèi)圖關(guān)系

2013-05-13 09:48:47

網(wǎng)絡(luò)接入接入方法綜合布線(xiàn)

2016-11-15 15:50:22

linux基礎(chǔ)命令vim

2011-07-22 09:43:37

java

2010-03-03 13:50:40

Python文件

2011-06-22 08:38:35

Java EE

2024-08-27 08:29:49

2021-04-27 19:20:54

微應(yīng)用模塊聯(lián)邦

2015-12-15 13:50:39

Fedora發(fā)行版Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

av日韩在线看| 欧美著名女优| 五月天丁香综合久久国产| 国产成年人在线观看| 日韩中文字幕三区| а√天堂资源地址在线下载| 日韩.com| 床上的激情91.| 欧美刺激脚交jootjob| 亚洲高清三级视频| 国产高清一区| 日韩av色综合| 日韩av电影手机在线| ㊣最新国产の精品bt伙计久久| 三级久久三级久久| 色综合久久精品亚洲国产| 人人超碰在线| 97se亚洲国产综合自在线| 91福利入口| 福利片一区二区| 中文字幕日韩欧美精品在线观看| 国产在线播放av| 亚洲图片有声小说| 日本丰满大乳奶| 91夜夜蜜桃臀一区二区三区| 91极品美女在线| 国内精品久久久久影院优| 日本福利视频在线观看| 黄色免费在线观看| 国产精品入口| 欧洲激情一区二区| 7777免费精品视频| 成年人视频网站免费观看| 99久久伊人| 国产精品伦理一区二区| 91pron在线| sm久久捆绑调教精品一区| 国产成人午夜视频| 97精品国产97久久久久久| 黄网站在线免费| 91免费观看视频| 国产mv久久久| 高清在线观看av| 蜜臀精品久久久久久蜜臀| 久热精品视频在线免费观看| 精品日韩久久久| 国产黄色精品| 久久综合五月| 日韩免费在线观看视频| 麻豆视频一区| 久久精品青青大伊人av| 韩日视频在线| 亚洲jizzjizz妇女| 中文字幕欧美日韩一区| 国产91精品在线播放| 日韩欧美高清dvd碟片| av毛片在线看| 7777精品久久久大香线蕉| 日本韩国欧美在线观看| 91精品一区国产高清在线gif| 色偷偷av一区二区三区乱| 国产高清在线观看| 精品福利在线视频| 日韩欧美国产综合在线| 毛片一区二区三区| 日韩在线第一区| 日韩av久操| 91干在线观看| 精品理论电影| 色999日韩国产欧美一区二区| 日韩大陆毛片av| 91视频一区| 欧美一级bbbbb性bbbb喷潮片| 女厕嘘嘘一区二区在线播放 | 亚洲精品国产成人| 色琪琪丁香婷婷综合久久| 一本大道久久a久久综合婷婷| 久久久久久一区| 午夜a一级毛片亚洲欧洲| 欧美成人aa大片| 国产欧美日韩小视频| 在线观看www91| 91在线视频| 在线观看亚洲专区| 99riav视频在线观看| 黑人极品videos精品欧美裸| 在线看片欧美| 久久精品国产理论片免费| 亚洲高清久久| 欧美videossexotv100| 亚洲美女尤物影院| 秋霞午夜一区二区| 欧美精品激情| 国产盗摄视频在线观看| 久久综合九色综合欧美就去吻| 色悠悠久久综合网| 91麻豆精品国产91久久久使用方法 | 男女av在线| 91精品国产91久久久久久一区二区 | 麻豆视频网站在线观看| 久久精品这里都是精品| 性网站在线播放| 国产精品6699| 亚洲无av在线中文字幕| 久草精品在线| 懂色av一区二区夜夜嗨| 国产探花视频在线观看| 亚洲免费成人av电影| 成人免费高清| 97精品一区二区三区| 在线亚洲自拍| 国产美女无遮挡网站| 国产精品久久影院| 香蕉视频在线免费| 日韩av一区在线| 亚洲国产一区二区三区a毛片| 久久久久久欧美精品色一二三四 | 成人不卡视频| 国产精品久久久久77777| 91老司机福利在线| 日韩欧美激情电影| 欧美高清中文字幕| 一区在线观看视频| 亚洲综合日韩在线| 依依成人精品视频| 麻豆视频久久| 欧美老女人xx| 国产成人综合在线| h网站在线播放| 亚洲精品一区二区三区香蕉 | 亚洲综合日韩中文字幕v在线| 国产成人av电影在线观看| av视屏在线播放| 久久成人av网站| 欧美色图在线播放| 成人www视频网站免费观看| 久久的精品视频| 亚洲三级国产| 成人免费影院| 81精品国产乱码久久久久久| 99精品热视频| 北条麻妃在线一区二区免费播放 | 99久久99久久精品免费看蜜桃| 国产在线视频欧美一区| 91嫩草视频在线观看| www.久久精品| 欧美视频在线视频精品| 成人国产在线看| 欧美日韩美女一区二区| 久久婷婷国产| 日韩免费网站| 亚洲天堂第一区| 中文字幕一精品亚洲无线一区| av一区二区三区黑人| 久久91精品| 狠狠热免费视频| 高清欧美一区二区三区| 国产精品一卡二| 久久不射影院| 26uuu亚洲国产精品| 五月天精品一区二区三区| 91色在线看| 400部精品国偷自产在线观看| 7777精品伊人久久久大香线蕉| 99精品电影| 日本在线高清| 在线观看国产一级片| 国内精品一区二区三区| 精品久久久久久国产91| 宅男噜噜噜66一区二区| 日本不卡免费高清视频在线| 欧美性xxxx69| 91精品国产91久久久久久最新毛片| 中文字幕视频一区二区三区久| 久久久夜色精品亚洲| 欧美日中文字幕| av日韩中文| 日本中文在线| 国产911网站| 欧美a级免费视频| 国产精品中出一区二区三区| 国产欧美一区二区精品忘忧草| 黄色欧美日韩| 国产欧美日韩免费观看| 中文字幕一区二区三区日韩精品 | 毛片在线播放视频| 九九热这里只有在线精品视 | 日本妇女一区| 久久香蕉一区| 日韩不卡一二区| 欧美videos中文字幕| 欧美不卡一区二区三区| 色综合久久66| 五月天久久比比资源色| 国产精品久久二区二区| 99综合精品| 六月丁香综合在线视频| 久久精品中文| 日本女人一区二区三区| 亚洲综合欧美|