freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ios平臺(tái)下并發(fā)編程的研究和實(shí)現(xiàn)畢業(yè)論文(參考版)

2024-09-05 16:58本頁面
  

【正文】 GCD 支持以下 Dispatch Sources: 1.。 GCD 就是依據(jù)這種方式,允許提交請(qǐng)求,并且使用 block和調(diào)度隊(duì)列來回調(diào)請(qǐng)求的結(jié)果。調(diào)用內(nèi)核或者其他系統(tǒng)層次涉及到的改變相比 應(yīng)用程序本身 的進(jìn)程相是相當(dāng)耗時(shí)的。 避免在提交隊(duì)列的任務(wù)中使用 鎖,盡管這種行為是安全的,但是性能上會(huì) 有 很大影響,如果有需要用到鎖的地方,可以使用串行隊(duì)列來替代。 調(diào)度隊(duì)列和 線程安全 在調(diào)度隊(duì)列中討論線程安全的問題似乎看起來很奇怪,但是線程安全仍然是一個(gè)有意思的話題,當(dāng)在程序中使用并發(fā)時(shí),下面 總結(jié) 了一些常用的知識(shí)點(diǎn): 1. 調(diào)度隊(duì)列本身是線程安全的,換句話說,系統(tǒng)沒有采取鎖或者同步這個(gè)隊(duì)列時(shí),可以在任何線程中向 dispatch queue 提交任務(wù) [12]。 // 做一些其他的工作 // 當(dāng)需要等待組中的任務(wù)完成后才能繼續(xù)工作時(shí) dispatch_group_wait(group, DISPATCH_TIME_FOREVER)。 // 創(chuàng)建一個(gè)組 dispatch_group_t group = dispatch_group_create()。 下面是一個(gè)基本的例子, dispatch_group_async 函數(shù)將任務(wù)與組關(guān)聯(lián)起來,所有執(zhí)行完成后出隊(duì),使用 dispatch_group_wait 函數(shù)等待一組任務(wù)的完成。 等待一組任務(wù)的完成 dispatch groups 是一種可以鎖住一個(gè)線程直到其他任務(wù)完成執(zhí)行的方式,如果當(dāng)前任務(wù)需要其他一個(gè)或多個(gè)任務(wù)完成時(shí)才可以執(zhí)行,這種情況下 可以使用 dispatch groups。 // 完成工作后,釋放資源,并且標(biāo)識(shí)信號(hào)量 close(fd)。 // 等待可 用的文件描述符 dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER)。每個(gè)程序都給定了有限的文件描述符可以使用,如果某個(gè)任務(wù)需要處理大量的文件,那么肯定不想同一時(shí)間打開大量的文件使得文件描述符超出了限制。 4. 當(dāng)完成與資源有關(guān)工作后,釋放對(duì)資源的引用并且標(biāo)識(shí)信號(hào)量,通 過dispathch_semaphore_signal 函數(shù)。 2. 在每一個(gè)任務(wù)中,調(diào)用 dispatch_semaphore_wait 等待信號(hào)量。只有極少數(shù)資源無法獲取時(shí),才會(huì)調(diào)用內(nèi)核,因?yàn)橄到y(tǒng)需要暫停線程直到該信號(hào)量狀態(tài)消失。 dispatch 信號(hào)量與傳統(tǒng)信號(hào)量類似但是有一點(diǎn)不同,當(dāng)資源可獲取時(shí), dispatch信號(hào)量的獲取相比傳統(tǒng)信號(hào)量只需要很少的時(shí)間。 暫停和恢復(fù)調(diào)用是異步的,并且只影響還未執(zhí)行的 block,正在執(zhí)行的 block不會(huì)被打斷。引用計(jì)數(shù)大于 0 時(shí),會(huì)掛起。如果 block創(chuàng)建了很多的對(duì)象,可能需要相應(yīng)的自動(dòng)引用池 [10]。每一個(gè)調(diào)度隊(duì)列維護(hù)自己的自動(dòng)引用池來確保自動(dòng)釋放的對(duì)象會(huì)在某個(gè)點(diǎn)釋放,隊(duì)列不能保證他們實(shí)際 release 了這些對(duì)象。 可以通過調(diào)用 dispatch_get_main_queue 函數(shù),獲取依附主線程的調(diào)度隊(duì)列,因 而 可以作為應(yīng)用程序的一個(gè)同步點(diǎn)。 在主線程上執(zhí)行任務(wù) GCD 提供了一個(gè)特殊的調(diào)度隊(duì)列,能夠在主線程上執(zhí)行任務(wù),這個(gè)隊(duì)列自動(dòng)給程武漢工程大學(xué) 畢業(yè)論文 22 序設(shè)置一個(gè) RunLoop,并對(duì)主線程自動(dòng) drain。 應(yīng)該確保給每次循環(huán)迭代安排合適的工作量,因?yàn)橛袎K添加到隊(duì)列的開銷以及調(diào)度執(zhí)行代碼的開銷。 dispatch_apply(count, queue, ^(size_t i) { printf(%u\n,i)。如果當(dāng)前的任務(wù)比較耗時(shí),最好在另一個(gè)線程中調(diào)用它。 像普通的 for 循環(huán), dispatch_apply 或 dispatch_apply_f 函數(shù)在所有的循環(huán)迭代完成之前不會(huì)返回。 如果每次迭代的工作與其他迭代是獨(dú)立的,而且每次循環(huán)執(zhí)行的順序不重要,那么可以使用 dispatch_apply或 dispatch_apply_f 函數(shù)來替換循環(huán),這樣可能會(huì)同時(shí)執(zhí)行多個(gè)循環(huán)迭代。 })。})。 // 在默認(rèn)的并發(fā)隊(duì)列中 執(zhí)行 任務(wù)并且在任務(wù)完成后執(zhí)行用戶提供的 pletion block dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^ { int avg = average(data, len)。調(diào)用的代碼通常會(huì)提武漢工程大學(xué) 畢業(yè)論文 21 供 pletion block 作為一個(gè)參數(shù),所有任務(wù)完成后的代碼作為 pletion block 提交給隊(duì)列。在傳統(tǒng)的異步編程中,可能使用回調(diào)機(jī)制來處理,但在調(diào)度隊(duì)列中,可以使用 pletion block[8]。 printf(Both blocks have pleted.\n)。 dispatch_sync(myCustomQueue, ^{ printf(Do some more work here.\n)。 })。 myCustomQueue = dispatch_queue_create(, NULL)。在串行隊(duì)列中會(huì)造成死鎖,在并發(fā)線程中也應(yīng)該避免這樣做。這些函數(shù)阻塞當(dāng)前線程的執(zhí)行,直到任務(wù)完成。因此,使用異步的方式,能夠 可以 在添加完之后繼續(xù)做其他事情,這一點(diǎn)在主線程中使用時(shí)很重要 [7]。 添加單個(gè)任務(wù)到隊(duì)列中 有兩種方式將一個(gè)任務(wù)添加到隊(duì)列中,同步的或異步的。一旦進(jìn)入隊(duì)列,考慮到其約束和現(xiàn)有的任務(wù)已經(jīng)在隊(duì)列中,就盡可能最快 地 開始執(zhí)行任務(wù)。 } return serialQueue。 dispatch_set_finalizer_f (serialQueue, amp。 // 創(chuàng)建隊(duì)列并設(shè)置上下文指針 dispatch _queue_t serialQueue = dispatch_queue_create(,NULL)。 } dispatch_queue_t createMyQueue() { MyDataContext* data = (MyDataContext *)malloc(sizeof(MyDataContext))。 // 清空 myCleanUpDataContextFunction(theData)。這個(gè)方法只有在上下文數(shù)據(jù)指針不為 NULL 時(shí)才會(huì) 被調(diào)用。 為隊(duì)列提供清空方法 當(dāng)創(chuàng)建串行隊(duì)列后,可以為結(jié)束方法附加執(zhí)行自定義的清除操作,這個(gè)操作在當(dāng)隊(duì)列釋放時(shí)被執(zhí)行。 對(duì)于隊(duì)列來說,可以使用上下文數(shù)據(jù)來存儲(chǔ) ObjectiveC 對(duì)象的指針,或者其他的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)能夠幫助標(biāo)識(shí)隊(duì)列或者代碼中的其他用途。 使用隊(duì)列存儲(chǔ)自定義的上下文信息 dispatch 對(duì)象(包括調(diào)度隊(duì)列)允許將對(duì)象和自定義上下文聯(lián)系起來。這條基本的守則保證了當(dāng) 需要 使用時(shí),它仍存在 于 內(nèi)存之中。當(dāng)創(chuàng)建一個(gè)串行隊(duì)列時(shí),其初始的引用計(jì)數(shù)為 1,可以使用 dispatch_retain 或 dispatch_release 函數(shù)來增加或者減少引用計(jì)數(shù), 引用計(jì)數(shù) 為 0 時(shí),系統(tǒng)將異步的釋放這條隊(duì)列。 使用 dispatch_get_global_queue 獲取全局并發(fā)隊(duì)列中的任意一個(gè)。 在 運(yùn)行時(shí)獲取常用的隊(duì)列 GCD 提供了一些函數(shù),方便在運(yùn)行時(shí)獲取一些常見的隊(duì)列: 使用 dispatch_get_current_queue 獲取當(dāng)前隊(duì)列的標(biāo)識(shí)符,在 block 中調(diào)用時(shí),可以獲取當(dāng)前 block運(yùn)行隊(duì)列的標(biāo)識(shí)符,在 block外調(diào)用,將返回程序默認(rèn)的并發(fā)隊(duì)列。 queue = dispatch_queue_create(,NULL)。 下面的例 子 展示了創(chuàng)建串行隊(duì)列的步驟, dispatch_queue_create 函數(shù)中的第一個(gè)參數(shù)標(biāo)識(shí)隊(duì)列名,第二個(gè)參數(shù)是隊(duì)列的一些屬性,第二個(gè)值目前填 NULL,以后可能會(huì)用到。在希望大量任務(wù)同 時(shí)執(zhí)行時(shí),將其添加到全局隊(duì)列是最好的方式。不同于鎖,串行調(diào)度隊(duì)列確保執(zhí)行任務(wù)時(shí)按照可預(yù)見的順序,只要同步的提交任務(wù)到串行隊(duì)列,那么隊(duì)列就不會(huì)陷入僵局(死鎖)。 創(chuàng)建串行調(diào)度隊(duì)列 串行調(diào)度隊(duì)列在希望任務(wù)按照指定順序執(zhí)行時(shí)特別有用,串行隊(duì)列每次僅執(zhí)行一個(gè)任務(wù),并且從頭開始執(zhí)行。 雖然調(diào)度隊(duì)列是引用計(jì)數(shù)的對(duì)象,但是不需要 retain和 release 全局隊(duì)列,因?yàn)樗诔绦蛑惺侨值模?retain和 release 操作都會(huì)被忽略。 還可以通過傳入不同的值來獲取不同優(yōu)先級(jí)的隊(duì)列。 系統(tǒng)為每個(gè)程序提供 4 個(gè)并發(fā)隊(duì)列,它們對(duì)于應(yīng)用程序來說是全局的,唯一的區(qū)別武漢工程大學(xué) 畢業(yè)論文 18 是其優(yōu)先級(jí)不同,由于它們是全局的,所以無需顯示的創(chuàng)建,使用 dispatch_global_queue 函數(shù)即可。在任意給定的時(shí)間,全局并發(fā)隊(duì)列同時(shí)執(zhí)行任務(wù)的數(shù)量是動(dòng)態(tài)變化的,這個(gè)數(shù)量受當(dāng)前程序的影響。 獲取全局的并發(fā)隊(duì)列 如果有大量的任務(wù)需要執(zhí)行, 并且 它們是可以同時(shí)進(jìn)行的,那么全局并發(fā)隊(duì)列是一個(gè)很好的選擇。除此之外,如果考慮使用隊(duì)列的特殊用途,也可以通過配置相應(yīng)的屬性來實(shí)現(xiàn)。 創(chuàng)建和管理調(diào)度隊(duì)列 在添加 block 到隊(duì)列前,需要決定使用哪種類型的隊(duì)列,以及如何使用它。雖然 GCD 調(diào)度隊(duì)列有自己的自動(dòng)引用 池 ,但是并不能保證這些 pool 一定 會(huì)被 drain。如果同一個(gè)調(diào)度隊(duì)列的任務(wù)希望共享數(shù)據(jù),請(qǐng)使用調(diào)度隊(duì)列的上下文指針存儲(chǔ)數(shù)據(jù)。最好是通過工具來收集一些數(shù)據(jù)加以判斷。 2. 當(dāng) block添加到調(diào)度隊(duì)列時(shí)會(huì)自動(dòng) copy,所以 無需 再次顯示 地 去 copy。 但 不應(yīng)該捕獲很大的數(shù)據(jù)類型或者由上下文創(chuàng)建刪除的指針對(duì)象。然而,同步執(zhí)行的代碼塊,也可以使用 __block 關(guān)鍵字前綴修飾的變量,并可返回到父作用域中。在 block 中訪問變量會(huì)將其復(fù)制到堆上, 以便于之后對(duì)該變量的訪問(棧上的變量一出棧就銷毀了)。 武漢工程大學(xué) 畢業(yè)論文 17 block 一個(gè)很重要的優(yōu)點(diǎn)就是能夠引用自己作用域外的變量,當(dāng)在函數(shù)或方法中創(chuàng)建 block時(shí) ,它在某種程度上類似于傳統(tǒng)的代碼塊。 block能夠很容易地定義一個(gè)自包含的工作單元,盡管看起來類似于函數(shù)指針,其實(shí)是用底層的數(shù)據(jù)結(jié)構(gòu)表示,它類似于對(duì)象,并 由 編譯器創(chuàng)建和管理。當(dāng)監(jiān)聽的事件發(fā)生時(shí), Dispatch Source 異步地提交任務(wù)代碼到指定的隊(duì)列 中 去處理。 只有當(dāng) 信號(hào)量不可用,調(diào)用線程需阻塞時(shí), Dispatch semaphores 才會(huì)調(diào)起內(nèi)核。它提供了一種非常有用的同步機(jī)制,依賴其他任務(wù)的完成。盡管不需要?jiǎng)?chuàng)建自己的主隊(duì)列,但是需要確保程序能夠在主線程中快速 地 執(zhí)行完所添加的任務(wù),因?yàn)楹臅r(shí)的操作會(huì)阻塞 UI, 使得 程序變得卡頓。與應(yīng)用程序的其他事件執(zhí)行交織在一起加入到主線程的 RunLoop 中。在 iOS 5 以后,可以指定調(diào)度隊(duì)列類型為 DISPATCH_QUEUE_CONCURRENT 來創(chuàng)建自己的并發(fā)調(diào)度隊(duì)列,除此之外,系統(tǒng)已經(jīng)提供了四個(gè)預(yù)先定義的調(diào)度隊(duì)列供使用。但任務(wù)仍然按照添加的順序執(zhí)行,當(dāng)前的任務(wù)運(yùn)行在不同的線程上,這些 線程 由調(diào)度隊(duì)列管理。串行隊(duì)列經(jīng)常用來執(zhí)行一些同步操作,比如對(duì)于指定資源的存取 。 串行隊(duì)列( Serial Queue) 串行隊(duì)列,也稱私有調(diào)度隊(duì)列,執(zhí)行順序 為 任務(wù)添加的順序。 4. 添加 到隊(duì)列的任務(wù)必須滿足可以執(zhí)行的條件, 比如 資源就緒等。 2. 系統(tǒng)決定同一時(shí)間類可以執(zhí)行任務(wù)的總數(shù)。而調(diào)度隊(duì)列運(yùn)行在自己的程序空間中,只有在必 要時(shí)才會(huì)中斷內(nèi)核。而使用調(diào)度隊(duì)列時(shí),可以將這兩個(gè)任務(wù)添加進(jìn)同一條串行隊(duì)列來確保同時(shí)只有一個(gè)任務(wù)可以修改資源。 使用調(diào)度隊(duì)列編碼要比線程簡(jiǎn)單的多,其編碼的關(guān)鍵是設(shè)計(jì)能夠異步執(zhí)行且資源就緒的任務(wù)。相比于應(yīng)用程序本身,操作系統(tǒng)能夠更加高效 地 管理線程,系統(tǒng)能夠根據(jù)可用的資源以及當(dāng)前的并發(fā)線程數(shù)量,動(dòng)態(tài) 地 擴(kuò)展正在運(yùn)行線程的數(shù)量。調(diào)度隊(duì)列能夠讓開發(fā)者更加專注于任務(wù)的處理,而無需擔(dān)心線程的管理和創(chuàng)建。最直接的優(yōu)勢(shì)就是簡(jiǎn)單的工作隊(duì)列以及編程模型。 GCD 已經(jīng)提供了一些 常用的調(diào)度隊(duì)列,也可以根據(jù)自己的需求創(chuàng)建自定義調(diào)度隊(duì)列。 調(diào)度隊(duì)列是一種類似對(duì)象的結(jié)構(gòu),它管理提交到它上的任務(wù)。 調(diào)度隊(duì)列介紹 調(diào)度隊(duì)列是在程序中執(zhí)行同步或異步代碼的比較簡(jiǎn)單的一種方式,任務(wù)就是程序中需要執(zhí)行的一些簡(jiǎn)單的工作,例如執(zhí)行一些計(jì)算,創(chuàng)建或修改一個(gè)數(shù)據(jù)結(jié)構(gòu),從文件中讀取數(shù)據(jù)并進(jìn)行處理等等這樣的一些工作。相比于線程級(jí)別代碼,其 更易于使用,且效率要高。武漢工程大學(xué) 畢業(yè)論文 15 第四章 調(diào)度 隊(duì)列 在 iOS 平臺(tái)中, GCD 調(diào)度隊(duì)列是執(zhí)行任務(wù)的強(qiáng)大工具,可以使用同步或異步方式執(zhí)行任意的代碼塊。 除了等待單個(gè)操作對(duì)象完成,也可以等待整個(gè)操作隊(duì)列完成,然后可以繼續(xù)向其添加操作對(duì)象。但是盡量避免使用這個(gè)方法。 武漢工程大學(xué) 畢業(yè)論文 14 只有在確定不再需要時(shí)才取消它,取消其實(shí)相當(dāng)于操作對(duì)象已經(jīng)完成,如果被依賴項(xiàng)被取消,那么這個(gè)依賴關(guān)系就不再成立了。 } return ranIt。 [self didChangeValueForKey:” isExecuting”]。 finished = YES。
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1