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

正文內(nèi)容

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

  

【正文】 雖然這樣可以代替context指針,但是應(yīng)該謹(jǐn)慎地使用這種方式。多數(shù)類(lèi)型的調(diào)度源不需要取消處理操作,除非對(duì)調(diào)度源有自定義的行為并且需要在釋放時(shí)執(zhí)行。// 基于block的事件處理操作void (^dispatch_block_t)(void)// 基于函數(shù)的時(shí)間處理操作void (*dispatch_function_t)(void *)在事件處理操作中,可以從調(diào)度源提供的事件中獲取事件的相應(yīng)信息。2. 配置調(diào)度源: a) 給它分配一個(gè)事件處理操作;b) 對(duì)于定時(shí)器源,使用dispatch_source_set_timer函數(shù)設(shè)置定時(shí)器信息。在配置一個(gè) 調(diào)度源時(shí),需要指定想要監(jiān)聽(tīng)的事件、調(diào)度隊(duì)列以及用于處理事件的代碼。// 完成工作后釋放這個(gè)組dispatch_release(group)。3. 當(dāng)?shù)却{(diào)用返回時(shí),使用資源繼續(xù)工作。如果不想創(chuàng)建Cocoa程序,而且不想顯示地設(shè)置RunLoop,那么必須調(diào)用dispatch_main方法drain主線(xiàn)程,當(dāng)然也可以添加任務(wù)到這個(gè)隊(duì)列,但是它不會(huì)執(zhí)行,直到調(diào)用這個(gè)方法。 dispatch_async(queue, ^{ block(avg)。永遠(yuǎn)不應(yīng)該調(diào)用同步任務(wù)到你需要執(zhí)行任務(wù)的線(xiàn)程,因?yàn)檫@樣可能會(huì)造成死鎖。 // 釋放 free(theData)。使用dispatch_get_main_queue獲取程序主線(xiàn)程對(duì)應(yīng)的串行隊(duì)列,這個(gè)隊(duì)列是系統(tǒng)自動(dòng)創(chuàng)建的,調(diào)用dispatch_main函數(shù)或者配置RunLoop在主線(xiàn)程上。如下:dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORTITY_DEFAULT,0)。3. 盡管使用隊(duì)列要比原生的線(xiàn)程效率高,但是創(chuàng)建block和在隊(duì)列中執(zhí)行仍然需要一定的開(kāi)銷(xiāo),如果某個(gè)塊執(zhí)行的任務(wù)量很小,直接調(diào)用它可能要比在隊(duì)列中執(zhí)行好一些。Dispatch semaphores:類(lèi)似于傳統(tǒng)的信號(hào)量,通常要高效一些。3. 系統(tǒng)在選取新的任務(wù)執(zhí)行時(shí)會(huì)考慮隊(duì)列的優(yōu)先級(jí)。所有的調(diào)度隊(duì)列都是先進(jìn)先出的,因此任務(wù)開(kāi)始執(zhí)行的順序與添加順序一致。 ranIt = YES。操作對(duì)象不會(huì)在isReady方法返回YES之前執(zhí)行,isReady方法取決于其依賴(lài)的對(duì)象是否全部執(zhí)行完畢。對(duì)于添加到隊(duì)列的操作對(duì)象,執(zhí)行順序首先取決于已經(jīng)入隊(duì)操作對(duì)象的準(zhǔn)備情況,然后取決于其優(yōu)先級(jí)。如果需要取消操作對(duì)象,只需調(diào)用其cancel方法即可,同樣,整個(gè)過(guò)程可能不需要修改隊(duì)列優(yōu)先級(jí)。// 開(kāi)啟單獨(dú)的線(xiàn)程并執(zhí)行任務(wù)[NSThread detachNewThreadSelector:selector(main) toTarget:self withObject:nil]。isConcurrent:重載并且返回YES即可。操作對(duì)象應(yīng)該在整個(gè)執(zhí)行周期中檢查是否有取消事件發(fā)生,并且優(yōu)雅地處理該事件。,正在執(zhí)行時(shí)也可以取消。不過(guò),使用線(xiàn)程時(shí)最好再次確認(rèn)其必要性。如果使用block封裝任務(wù),可以向一個(gè)串行或并行的隊(duì)列添加block來(lái)執(zhí)行。在考慮程序中引入并發(fā)前,首先應(yīng)該從明確程序正確的行為開(kāi)始。7. 串行隊(duì)列提供了更加有效的同步機(jī)制。使用異步編程的技術(shù)之一為 GCD(Grand Central Dispatch)。第二章 并發(fā)程序的設(shè)計(jì)早期的計(jì)算機(jī)執(zhí)行最小任務(wù)所需的時(shí)間單元取決于CPU的時(shí)鐘速度,但隨著CPU技術(shù)的發(fā)展以及處理器上的核心越來(lái)越密集,散熱和其他物理因素開(kāi)始影響CPU的最大時(shí)鐘速度。不能創(chuàng)建很多的線(xiàn)程,然后認(rèn)為程序會(huì)很好的運(yùn)行這些線(xiàn)程。在多核 CPU 上才以真正的并行方式來(lái)運(yùn)行。多線(xiàn)程也作為越來(lái)越重要的一個(gè)部分需要開(kāi)發(fā)者來(lái)掌握。同時(shí),這些 API 本身處在不同的抽象層級(jí)上。相比較傳統(tǒng)的基于線(xiàn)程的系統(tǒng)和應(yīng)用程序,OS X 和 iOS 更多地采用異步方法來(lái)執(zhí)行并行任務(wù)。如果把這項(xiàng)任務(wù)交由開(kāi)發(fā)者,那么多線(xiàn)程編程將會(huì)變得更加復(fù)雜,因此,最好的方式是使用系統(tǒng)為我們提供的并發(fā)編程模型。并行的調(diào)度隊(duì)列在同一時(shí)間內(nèi)可以執(zhí)行多個(gè)任務(wù),并不需要等待上個(gè)任務(wù)完成。提交到操作隊(duì)列的對(duì)象必須是NSOperation類(lèi)的子類(lèi),NSOperation子類(lèi)的對(duì)象封裝執(zhí)行的任務(wù)以及所需的數(shù)據(jù)。如果任務(wù)的執(zhí)行結(jié)果與任務(wù)中步驟的執(zhí)行順序無(wú)關(guān),那么可以使用并發(fā)來(lái)提高性能。在代碼中引用并發(fā)之前,無(wú)論是使用隊(duì)列還是線(xiàn)程,都應(yīng)該采集一些基準(zhǔn)的性能指標(biāo)反映當(dāng)前的程序性能。當(dāng)所有相關(guān)的block執(zhí)行完畢后,operation對(duì)象才完成。代碼示例如下:interface CWNonConcurrentOperation : NSOperationproperty id (strong) data。通過(guò)調(diào)用start方法手動(dòng)執(zhí)行操作。}// 重載實(shí)現(xiàn) KVO (BOOL)isExecuting { return executing。 [self didChangeValueForKey:” isFinished”]。這種依賴(lài)性表示當(dāng)前的對(duì)象只有在目標(biāo)對(duì)象完成時(shí)才可以開(kāi)始執(zhí)行。創(chuàng)建隊(duì)列與創(chuàng)建其他對(duì)象的方式一樣。 } ranIt = YES。第四章 調(diào)度隊(duì)列在iOS平臺(tái)中,GCD 調(diào)度隊(duì)列是執(zhí)行任務(wù)的強(qiáng)大工具,可以使用同步或異步方式執(zhí)行任意的代碼塊。使用調(diào)度隊(duì)列編碼要比線(xiàn)程簡(jiǎn)單的多,其編碼的關(guān)鍵是設(shè)計(jì)能夠異步執(zhí)行且資源就緒的任務(wù)。在iOS 5以后,可以指定調(diào)度隊(duì)列類(lèi)型為 DISPATCH_QUEUE_CONCURRENT來(lái)創(chuàng)建自己的并發(fā)調(diào)度隊(duì)列,除此之外,系統(tǒng)已經(jīng)提供了四個(gè)預(yù)先定義的調(diào)度隊(duì)列供使用。在block中訪(fǎng)問(wèn)變量會(huì)將其復(fù)制到堆上,以便于之后對(duì)該變量的訪(fǎng)問(wèn)(棧上的變量一出棧就銷(xiāo)毀了)。除此之外,如果考慮使用隊(duì)列的特殊用途,也可以通過(guò)配置相應(yīng)的屬性來(lái)實(shí)現(xiàn)。在希望大量任務(wù)同時(shí)執(zhí)行時(shí),將其添加到全局隊(duì)列是最好的方式。對(duì)于隊(duì)列來(lái)說(shuō),可以使用上下文數(shù)據(jù)來(lái)存儲(chǔ)ObjectiveC對(duì)象的指針,或者其他的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)能夠幫助標(biāo)識(shí)隊(duì)列或者代碼中的其他用途。一旦進(jìn)入隊(duì)列,考慮到其約束和現(xiàn)有的任務(wù)已經(jīng)在隊(duì)列中,就盡可能最快地開(kāi)始執(zhí)行任務(wù)。printf(Both blocks have pleted.\n)。如果當(dāng)前的任務(wù)比較耗時(shí),最好在另一個(gè)線(xiàn)程中調(diào)用它。暫停和恢復(fù)調(diào)用是異步的,并且只影響還未執(zhí)行的block,正在執(zhí)行的block不會(huì)被打斷。dispatch groups是一種可以鎖住一個(gè)線(xiàn)程直到其他任務(wù)完成執(zhí)行的方式,如果當(dāng)前任務(wù)需要其他一個(gè)或多個(gè)任務(wù)完成時(shí)才可以執(zhí)行,這種情況下可以使用dispatch groups。GCD支持以下Dispatch Sources:1. 定時(shí)器dispatch source :生成周期性的通知。如果新的事件已經(jīng)到達(dá),而隊(duì)列中上一個(gè)事件尚未被處理,那么可以將這兩個(gè)事件的數(shù)據(jù)合并后作為一個(gè)新的事件。當(dāng)事件發(fā)生后,將提交事件處理操作到指定的隊(duì)列上來(lái)處理事件。dispatch_source_get_handle:這個(gè)函數(shù)返回調(diào)度源管理的底層數(shù)據(jù)類(lèi)型。修改隊(duì)列可以改變執(zhí)行調(diào)度源事件的優(yōu)先級(jí)。雖然外部所有權(quán)的方式比較常見(jiàn),但當(dāng)希望創(chuàng)建自主的調(diào)度源,并讓它管理自己的行為時(shí),可以使用內(nèi)部所有權(quán)。在創(chuàng)建調(diào)度源時(shí)可以指定一個(gè)隊(duì)列,用于執(zhí)行事件處理器和取消處理器。調(diào)度源總是異步執(zhí)行其事件處理程序,所以可能之前捕獲的變量隨著事件處理程序的執(zhí)行已經(jīng)消失了。在創(chuàng)建調(diào)度源時(shí),必須定義事件處理操作,用于處理調(diào)度源產(chǎn)生的事件。因此調(diào)度源會(huì)retain自己的隊(duì)列防止過(guò)早釋放,因?yàn)楹芸赡茚尫藕笙乱粋€(gè)事件發(fā)生后找不到隊(duì)列。GCD就是依據(jù)這種方式,允許提交請(qǐng)求,并且使用block和調(diào)度隊(duì)列來(lái)回調(diào)請(qǐng)求的結(jié)果。// 完成工作后,釋放資源,并且標(biāo)識(shí)信號(hào)量close(fd)。引用計(jì)數(shù)大于0時(shí),會(huì)掛起。像普通的for循環(huán),dispatch_apply或dispatch_apply_f函數(shù)在所有的循環(huán)迭代完成之前不會(huì)返回。dispatch_sync(myCustomQueue, ^{ printf(Do some more work here.\n)。 } return serialQueue。dispatch對(duì)象(包括調(diào)度隊(duì)列)允許將對(duì)象和自定義上下文聯(lián)系起來(lái)。不同于鎖,串行調(diào)度隊(duì)列確保執(zhí)行任務(wù)時(shí)按照可預(yù)見(jiàn)的順序,只要同步的提交任務(wù)到串行隊(duì)列,那么隊(duì)列就不會(huì)陷入僵局(死鎖)。在添加block到隊(duì)列前,需要決定使用哪種類(lèi)型的隊(duì)列,以及如何使用它。block一個(gè)很重要的優(yōu)點(diǎn)就是能夠引用自己作用域外的變量,當(dāng)在函數(shù)或方法中創(chuàng)建block時(shí),它在某種程度上類(lèi)似于傳統(tǒng)的代碼塊。但任務(wù)仍然按照添加的順序執(zhí)行,當(dāng)前的任務(wù)運(yùn)行在不同的線(xiàn)程上,這些線(xiàn)程由調(diào)度隊(duì)列管理。相比于應(yīng)用程序本身,操作系統(tǒng)能夠更加高效地管理線(xiàn)程,系統(tǒng)能夠根據(jù)可用的資源以及當(dāng)前的并發(fā)線(xiàn)程數(shù)量,動(dòng)態(tài)地?cái)U(kuò)展正在運(yùn)行線(xiàn)程的數(shù)量。除了等待單個(gè)操作對(duì)象完成,也可以等待整個(gè)操作隊(duì)列完成,然后可以繼續(xù)向其添加操作對(duì)象。 ![anOp isCancelled]) { // 當(dāng)操作對(duì)象準(zhǔn)備好并且沒(méi)有被取消時(shí) if(![anOp isConcurrent]) { // 操作對(duì)象為串行執(zhí)行時(shí),直接調(diào)用start方法 [anOp start]。程序可以擁有多個(gè)操作隊(duì)列,但如果太多會(huì)有限制。使用NSOperation類(lèi)的addDependency:方法創(chuàng)建兩個(gè)對(duì)象之間的依賴(lài)關(guān)系。 // 在任務(wù)完成后,需要更改對(duì)應(yīng)的狀態(tài)信息 executing = NO。 } return self。操作隊(duì)列為非并發(fā)的任務(wù)提供了線(xiàn)程,不過(guò)現(xiàn)在大多數(shù)操作需要異步運(yùn)行,因此需要重載一些方法。對(duì)于并發(fā)操作,必須重載現(xiàn)有的一些代碼,下面各節(jié)主要講述重載的內(nèi)容。第一個(gè)子類(lèi)為NSInvocationOperation,基于一個(gè)方法選擇子和對(duì)象創(chuàng)建的對(duì)象,當(dāng)程序中已經(jīng)存在現(xiàn)有的方法,并且希望異步執(zhí)行時(shí),是一個(gè)較好的選擇。然而這些技術(shù)并不能保證一定能夠提高程序的性能或改善代碼的執(zhí)行效率。在羅列程序任務(wù)時(shí),應(yīng)該基本明確哪些任務(wù)并發(fā)處理時(shí)會(huì)高效一些。 Queues操作隊(duì)列由iOS中NSOperationQueue類(lèi)實(shí)現(xiàn)。調(diào)度隊(duì)列串行或并行地執(zhí)行任務(wù),任務(wù)開(kāi)始執(zhí)行的順序與其添加順序一致。例如,在8核CPU中,創(chuàng)建8個(gè)線(xiàn)程完成某個(gè)任務(wù),看起來(lái)似乎充分利用了CPU的多個(gè)核心,但是很有可能每個(gè)線(xiàn)程中用到的某個(gè)框架又創(chuàng)建了多個(gè)線(xiàn)程[1]。對(duì)于一個(gè)程序,由于線(xiàn)程的最佳數(shù)目基于系統(tǒng)負(fù)載和底層硬件而動(dòng)態(tài)改變,因此實(shí)現(xiàn)一個(gè)正確的線(xiàn)程解決方案是非常困難和復(fù)雜的。OS X 和 iOS 提供了幾種不同的 API 來(lái)支持并發(fā)編程。在計(jì)算機(jī)中,單個(gè)核心下的并發(fā)一般為時(shí)間片的輪流,宏觀上為多個(gè)任務(wù)同時(shí)執(zhí)行,微觀上每個(gè)時(shí)刻仍然只執(zhí)行一個(gè)任務(wù)。運(yùn)行在前臺(tái)的程序與用戶(hù)交互并且占用大量的 CPU 時(shí)間。即使得到了正確的數(shù)字,想要這么多線(xiàn)程之間不能干擾且高效運(yùn)行,仍然具有很大的難度。傳統(tǒng)意義上利用CPU多核特性的方式為創(chuàng)建多個(gè)線(xiàn)程,然而移動(dòng)設(shè)備上的CPU受限于系統(tǒng)負(fù)載和散熱等其他因素,不可以創(chuàng)建大量的線(xiàn)程而又使得程序很好的運(yùn)行。GCD 負(fù)責(zé)創(chuàng)建線(xiàn)程并在線(xiàn)程上執(zhí)行任務(wù)所需的代碼,現(xiàn)在由于線(xiàn)程管理是系統(tǒng)的一部分,GCD接管了線(xiàn)程管理以及任務(wù)的執(zhí)行,因此這種方式要比傳統(tǒng)創(chuàng)建線(xiàn)程的方式高效一些,更重要的是極大地減輕了開(kāi)發(fā)者的負(fù)擔(dān)。 Sources調(diào)度源是用于異步處理特殊系統(tǒng)類(lèi)型事件的基于C語(yǔ)言的機(jī)制。第一件事,就是羅列出程序所有要做的任務(wù)以及相關(guān)的數(shù)據(jù)結(jié)構(gòu)。如果工作單元對(duì)于執(zhí)行順序沒(méi)有要求,可以使用并發(fā)的隊(duì)列或者多個(gè)不同的并發(fā)隊(duì)列,具體取決于程序需求。本章節(jié)主要介紹 NSOperation 類(lèi)的使用以及自定義子類(lèi)化。應(yīng)該提交操作對(duì)象到操作隊(duì)列上,讓它們?cè)趩为?dú)的線(xiàn)程或者多個(gè)線(xiàn)程上執(zhí)行相應(yīng)的工作,而不是在主線(xiàn)程上做大量的操作。支持取消操作是很重要的,isCancelled方法調(diào)用返回非??欤虼丝梢灶l繁的調(diào)用而不會(huì)造成額外的開(kāi)銷(xiāo)。 BOOL finished。[self didChangeValueForKey:”isExecuting”]。成功建操作對(duì)象后,在將其添加到隊(duì)列之前,可以對(duì)操作對(duì)象進(jìn)行配置。優(yōu)先級(jí)只適用于同一個(gè)隊(duì)列中的不同對(duì)象,如果程序中有多個(gè)操作隊(duì)列,每個(gè)對(duì)象在不同的隊(duì)列中的優(yōu)先級(jí)是相互獨(dú)立的。如果程序中定義了一些并發(fā)的操作對(duì)象,那么應(yīng)該考慮在加載之前調(diào)用其isConcurrent方法,當(dāng)它返回NO時(shí),就能夠決定是在當(dāng)前線(xiàn)程同步執(zhí)行操作對(duì)象還是開(kāi)啟另一個(gè)線(xiàn)程。}一旦操作對(duì)象添加到操作隊(duì)列后,將由操作隊(duì)列高效地管理并且不能被移除,唯一出隊(duì)的方式就是取消它,可以通過(guò)調(diào)用其cancel方法取消單個(gè)的操作對(duì)象,也可以調(diào)用操作隊(duì)列的cancelAllOperation方法取消隊(duì)列中所有的操作對(duì)象。當(dāng)程序中引入并發(fā)性時(shí),相比較線(xiàn)程而言,調(diào)度隊(duì)列提供了幾個(gè)特有的優(yōu)勢(shì)。下面列出了幾種調(diào)度隊(duì)列,并相應(yīng)做了簡(jiǎn)要的說(shuō)明。Dispatch Source:對(duì)特定類(lèi)型的系統(tǒng)事件生成通知,可以使用Dispatch Source來(lái)觀察類(lèi)似進(jìn)程通知、信號(hào)或描述符事件等等。4. 不要試圖緩存一些與底層線(xiàn)程有關(guān)的數(shù)據(jù),以望另一個(gè)不同的block能夠更容易獲取這些數(shù)據(jù)。需要注意的是,第二個(gè)參數(shù)是為了以后使用而預(yù)留的,現(xiàn)在傳入0即可。調(diào)度隊(duì)列和其他dispatch對(duì)象都是引用計(jì)數(shù)類(lèi)型。 myInitializeDataContextfuction(data)。下面的例子演示了如何同步或異步執(zhí)行基于 block 的變體:dispatch_queue_t myCustomQueue。 // 當(dāng)用戶(hù)提供的block完成時(shí)release隊(duì)列 dispatch_release(queue)。GCD對(duì)Cocoa內(nèi)存管理提供了內(nèi)建的支持,因此可以在提交到隊(duì)列的bl
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1