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

正文內(nèi)容

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

2024-08-31 08:25上一頁面

下一頁面
  

【正文】 鎖或者同步這個隊(duì)列時(shí),可以在任何線程中向dispatch queue提交任務(wù)[12]。dispatch groups是一種可以鎖住一個線程直到其他任務(wù)完成執(zhí)行的方式,如果當(dāng)前任務(wù)需要其他一個或多個任務(wù)完成時(shí)才可以執(zhí)行,這種情況下可以使用dispatch groups。4. 當(dāng)完成與資源有關(guān)工作后,釋放對資源的引用并且標(biāo)識信號量,通過dispathch_semaphore_signal函數(shù)。暫停和恢復(fù)調(diào)用是異步的,并且只影響還未執(zhí)行的block,正在執(zhí)行的block不會被打斷??梢酝ㄟ^調(diào)用dispatch_get_main_queue函數(shù),獲取依附主線程的調(diào)度隊(duì)列,因而可以作為應(yīng)用程序的一個同步點(diǎn)。如果當(dāng)前的任務(wù)比較耗時(shí),最好在另一個線程中調(diào)用它。})。printf(Both blocks have pleted.\n)。在串行隊(duì)列中會造成死鎖,在并發(fā)線程中也應(yīng)該避免這樣做。一旦進(jìn)入隊(duì)列,考慮到其約束和現(xiàn)有的任務(wù)已經(jīng)在隊(duì)列中,就盡可能最快地開始執(zhí)行任務(wù)。}dispatch_queue_t createMyQueue(){ MyDataContext* data = (MyDataContext *)malloc(sizeof(MyDataContext))。對于隊(duì)列來說,可以使用上下文數(shù)據(jù)來存儲ObjectiveC對象的指針,或者其他的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)能夠幫助標(biāo)識隊(duì)列或者代碼中的其他用途。使用dispatch_get_global_queue獲取全局并發(fā)隊(duì)列中的任意一個。在希望大量任務(wù)同時(shí)執(zhí)行時(shí),將其添加到全局隊(duì)列是最好的方式。還可以通過傳入不同的值來獲取不同優(yōu)先級的隊(duì)列。除此之外,如果考慮使用隊(duì)列的特殊用途,也可以通過配置相應(yīng)的屬性來實(shí)現(xiàn)。最好是通過工具來收集一些數(shù)據(jù)加以判斷。在block中訪問變量會將其復(fù)制到堆上,以便于之后對該變量的訪問(棧上的變量一出棧就銷毀了)。只有當(dāng)信號量不可用,調(diào)用線程需阻塞時(shí),Dispatch semaphores才會調(diào)起內(nèi)核。在iOS 5以后,可以指定調(diào)度隊(duì)列類型為 DISPATCH_QUEUE_CONCURRENT來創(chuàng)建自己的并發(fā)調(diào)度隊(duì)列,除此之外,系統(tǒng)已經(jīng)提供了四個預(yù)先定義的調(diào)度隊(duì)列供使用。 4. 添加到隊(duì)列的任務(wù)必須滿足可以執(zhí)行的條件,比如資源就緒等。使用調(diào)度隊(duì)列編碼要比線程簡單的多,其編碼的關(guān)鍵是設(shè)計(jì)能夠異步執(zhí)行且資源就緒的任務(wù)。GCD已經(jīng)提供了一些常用的調(diào)度隊(duì)列,也可以根據(jù)自己的需求創(chuàng)建自定義調(diào)度隊(duì)列。第四章 調(diào)度隊(duì)列在iOS平臺中,GCD 調(diào)度隊(duì)列是執(zhí)行任務(wù)的強(qiáng)大工具,可以使用同步或異步方式執(zhí)行任意的代碼塊。}return ranIt。 } ranIt = YES。手動執(zhí)行時(shí)必須顯示調(diào)用其start方法,不能使用main或者其他方法,因?yàn)閟tart方法在真正運(yùn)行前做了一些檢查,尤其是start方法中實(shí)現(xiàn)了有關(guān)KVO通知的生成,保證了其他對象正確的依賴狀態(tài),此方法同時(shí)還保證了在取消之后不去執(zhí)行或者沒有準(zhǔn)備好執(zhí)行時(shí)拋出異常。創(chuàng)建隊(duì)列與創(chuàng)建其他對象的方式一樣。準(zhǔn)備情況取決于操作對象依賴的其他對象,但是優(yōu)先級是操作對象自身的屬性,默認(rèn)情況下,所有新創(chuàng)建的操作對象都有一個默認(rèn)的優(yōu)先級,但可以通過setQueuePriority方法增大或者減小優(yōu)先級。這種依賴性表示當(dāng)前的對象只有在目標(biāo)對象完成時(shí)才可以開始執(zhí)行。最后,除非操作對象會動態(tài)改變isConcurrent屬性,不然無需實(shí)現(xiàn)其KVO規(guī)則。 [self didChangeValueForKey:” isFinished”]。// 這個時(shí)候任務(wù)已經(jīng)開始了,需要改變executing狀態(tài)executing = YES。}// 重載實(shí)現(xiàn) KVO (BOOL)isExecuting { return executing。下面的代碼示例簡單的實(shí)現(xiàn)了如何子類化一個并發(fā)的操作對象:// 子類化 NSOperationinterface MyOperation: NSOperation { BOOL executing。通過調(diào)用start方法手動執(zhí)行操作。支持取消需要做的就是在代碼中周期性的調(diào)用操作對象的 isCancelled 方法,并且當(dāng)不返回YES時(shí)立刻返回。代碼示例如下:interface CWNonConcurrentOperation : NSOperationproperty id (strong) data。操作對象旨在提高程序的并發(fā)性,同時(shí)也是一種很好的封裝應(yīng)用程序行為的方式。當(dāng)所有相關(guān)的block執(zhí)行完畢后,operation對象才完成。第三章 操作隊(duì)列在iOS平臺中,Cocoa 框架中的 NSOperation 通過面向?qū)ο蟮姆绞椒庋b了執(zhí)行異步操作的工作,主要用于 Operation Queue。在代碼中引用并發(fā)之前,無論是使用隊(duì)列還是線程,都應(yīng)該采集一些基準(zhǔn)的性能指標(biāo)反映當(dāng)前的程序性能。如果對于執(zhí)行順序有特殊的要求,應(yīng)該使用串行的隊(duì)列。如果任務(wù)的執(zhí)行結(jié)果與任務(wù)中步驟的執(zhí)行順序無關(guān),那么可以使用并發(fā)來提高性能。了解程序預(yù)期的行為,在之后的設(shè)計(jì)中可以幫助驗(yàn)證設(shè)計(jì)的可行性。提交到操作隊(duì)列的對象必須是NSOperation類的子類,NSOperation子類的對象封裝執(zhí)行的任務(wù)以及所需的數(shù)據(jù)。提交到調(diào)度隊(duì)列中的任務(wù)必須封裝為block對象或者是一個函數(shù),調(diào)度隊(duì)列是GCDGCD和C運(yùn)行時(shí)的一部分。并行的調(diào)度隊(duì)列在同一時(shí)間內(nèi)可以執(zhí)行多個任務(wù),并不需要等待上個任務(wù)完成。這項(xiàng)技術(shù)能夠?qū)⒃鹃_發(fā)者需要編寫的線程管理代碼轉(zhuǎn)移到系統(tǒng)級別,開發(fā)者只需定義需要執(zhí)行的任務(wù)并將其添加到適合的調(diào)度隊(duì)列即可。如果把這項(xiàng)任務(wù)交由開發(fā)者,那么多線程編程將會變得更加復(fù)雜,因此,最好的方式是使用系統(tǒng)為我們提供的并發(fā)編程模型。因此廠商們開始將注意力轉(zhuǎn)移到如何在單個芯片上加入更多的處理器核心,即多核CPU,這樣單個芯片的性能將又得到提升,因而剩下的問題就是如何充分利用這些增加的核心。相比較傳統(tǒng)的基于線程的系統(tǒng)和應(yīng)用程序,OS X 和 iOS 更多地采用異步方法來執(zhí)行并行任務(wù)。我們無法確認(rèn)具體使用多少個核心才是最高效的,程序本身也無法很好地通過計(jì)算得出這個數(shù)值。同時(shí),這些 API 本身處在不同的抽象層級上?,F(xiàn)在大多數(shù)智能設(shè)備處理器都至少有兩個核心,移動操作系統(tǒng)能夠并行的運(yùn)行多個程序,其中大多數(shù)的程序運(yùn)行在后臺,并且經(jīng)常需要一小段 CPU 時(shí)間來執(zhí)行任務(wù)。多線程也作為越來越重要的一個部分需要開發(fā)者來掌握。由于多核時(shí)代的來臨,線程才開始擁有了真正意義上的并行處理。在多核 CPU 上才以真正的并行方式來運(yùn)行。每一條 API 都具有不同的功能和使用上的一些限制,這就需要在不同的情景下使用最適合的并發(fā)方式。不能創(chuàng)建很多的線程,然后認(rèn)為程序會很好的運(yùn)行這些線程。此外,線程的同步機(jī)制通常會給軟件設(shè)計(jì)增加復(fù)雜性和帶來風(fēng)險(xiǎn),有時(shí)候并不能保證一定會提高程序性能。第二章 并發(fā)程序的設(shè)計(jì)早期的計(jì)算機(jī)執(zhí)行最小任務(wù)所需的時(shí)間單元取決于CPU的時(shí)鐘速度,但隨著CPU技術(shù)的發(fā)展以及處理器上的核心越來越密集,散熱和其他物理因素開始影響CPU的最大時(shí)鐘速度。創(chuàng)建每個線程都會消耗一些內(nèi)存和內(nèi)核資源,因此如何動態(tài)地拓展線程數(shù)目就變得尤為重要,我們期望根據(jù)系統(tǒng)負(fù)載和當(dāng)前可用的資源能夠動態(tài)的控制當(dāng)前活動線程的數(shù)量。使用異步編程的技術(shù)之一為 GCD(Grand Central Dispatch)。串行的調(diào)度隊(duì)列同一時(shí)間只能執(zhí)行單個任務(wù),需要等待上個任務(wù)完成后才可以開始下個任務(wù)的執(zhí)行。7. 串行隊(duì)列提供了更加有效的同步機(jī)制。相比較調(diào)度隊(duì)列按照添加順序執(zhí)行任務(wù),操作隊(duì)列在決定任務(wù)執(zhí)行順序時(shí)還會考慮其他一系列因素。在考慮程序中引入并發(fā)前,首先應(yīng)該從明確程序正確的行為開始。如果整個任務(wù)中更改了某些步驟的執(zhí)行順序,任務(wù)執(zhí)行結(jié)果會改變,那么可能需要考慮串行執(zhí)行這些步驟。如果使用block封裝任務(wù),可以向一個串行或并行的隊(duì)列添加block來執(zhí)行。因此仍然需要以一種合理的方式去使用并發(fā),且不能過度的使用操作系統(tǒng)資源。不過,使用線程時(shí)最好再次確認(rèn)其必要性。第二個子類為NSBlockOperation,可以使用這個類并發(fā)地執(zhí)行一個或多個block對象。,正在執(zhí)行時(shí)也可以取消。每個操作對象至少需要實(shí)現(xiàn)初始化和主任務(wù)這兩個方法,通過這兩個方法,操作對象可以實(shí)例化并且得到一個需要執(zhí)行的任務(wù)。操作對象應(yīng)該在整個執(zhí)行周期中檢查是否有取消事件發(fā)生,并且優(yōu)雅地處理該事件。下面列出了并發(fā)執(zhí)行時(shí)需要重載的方法:start :(必須)所有的并發(fā)操作必須重載這個方法,實(shí)現(xiàn)自定義的行為。isConcurrent:重載并且返回YES即可。}// 重載操作對象的并發(fā)性屬性 (BOOL)isConcurrent { return YES。// 開啟單獨(dú)的線程并執(zhí)行任務(wù)[NSThread detachNewThreadSelector:selector(main) toTarget:self withObject:nil]。finished = YES。如果需要取消操作對象,只需調(diào)用其cancel方法即可,同樣,整個過程可能不需要修改隊(duì)列優(yōu)先級。這個方法創(chuàng)建一個從當(dāng)前對象到目標(biāo)對象單向的依賴關(guān)系,其返回結(jié)果可以作為一個參數(shù)來傳遞。對于添加到隊(duì)列的操作對象,執(zhí)行順序首先取決于已經(jīng)入隊(duì)操作對象的準(zhǔn)備情況,然后取決于其優(yōu)先級。操作隊(duì)列與系統(tǒng)根據(jù)內(nèi)核和系統(tǒng)負(fù)載,決定某一時(shí)刻維持多少并發(fā)的數(shù)量,因此,創(chuàng)建太多的操作隊(duì)列不一定能夠立即執(zhí)行其中的操作對象。操作對象不會在isReady方法返回YES之前執(zhí)行,isReady方法取決于其依賴的對象是否全部執(zhí)行完畢。 }else { [NSThread detachNewThreadSelector:selector(start) toTarget:anOp withObject:nil]。 ranIt = YES。如果需要暫停某個操作對象的執(zhí)行,可以使用隊(duì)列的setSuspended方法,掛起隊(duì)列不會影響已經(jīng)執(zhí)行的操作對象,只會暫停新添加到隊(duì)列中的操作對象。所有的調(diào)度隊(duì)列都是先進(jìn)先出的,因此任務(wù)開始執(zhí)行的順序與添加順序一致。此外,系統(tǒng)提供的線程通常會比自己創(chuàng)建的線程更快地開始執(zhí)行。3. 系統(tǒng)在選取新的任務(wù)執(zhí)行時(shí)會考慮隊(duì)列的優(yōu)先級。某個時(shí)刻正在執(zhí)行的任務(wù)數(shù)量是變化的,取決于操作系統(tǒng)當(dāng)前的狀態(tài)。Dispatch semaphores:類似于傳統(tǒng)的信號量,通常要高效一些。例如,block可以讀取上層作用域中的變量。3. 盡管使用隊(duì)列要比原生的線程效率高,但是創(chuàng)建block和在隊(duì)列中執(zhí)行仍然需要一定的開銷,如果某個塊執(zhí)行的任務(wù)量很小,直接調(diào)用它可能要比在隊(duì)列中執(zhí)行好一些。調(diào)度隊(duì)列能夠串行或并行執(zhí)行任務(wù)。如下:dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORTITY_DEFAULT,0)。跟并發(fā)隊(duì)列也不一樣,必須顯示地創(chuàng)建和管理需要使用的串行隊(duì)列,在程序中可以創(chuàng)建任意數(shù)量的串行隊(duì)列,但是要避免通過創(chuàng)建大量的串行隊(duì)列以達(dá)到同時(shí)執(zhí)行任務(wù)的想法。使用dispatch_get_main_queue獲取程序主線程對應(yīng)的串行隊(duì)列,這個隊(duì)列是系統(tǒng)自動創(chuàng)建的,調(diào)用dispatch_main函數(shù)或者配置RunLoop在主線程上。為了設(shè)置或獲取給定對象的數(shù)據(jù),可使用dispatch_set_context和dispatch_get_context函數(shù),系統(tǒng)任何時(shí)候都不會使用這些自定義的數(shù)據(jù),并且適時(shí)申請和釋放這些數(shù)據(jù)都是開發(fā)者的責(zé)任。 // 釋放 free(theData)。}為了執(zhí)行任務(wù),必須將其添加到調(diào)度隊(duì)列中,可以使用同步或異步的方式,也可以單個或成組的調(diào)度。永遠(yuǎn)不應(yīng)該調(diào)用同步任務(wù)到你需要執(zhí)行任務(wù)的線程,因?yàn)檫@樣可能會造成死鎖。})。 dispatch_async(queue, ^{ block(avg)。因此,你應(yīng)當(dāng)在隊(duì)列的上下文中執(zhí)行時(shí)小心一些,如果傳遞的參數(shù)是串行隊(duì)列,那么有可能造成死鎖。如果不想創(chuàng)建Cocoa程序,而且不想顯示地設(shè)置RunLoop,那么必須調(diào)用dispatch_main方法drain主線程,當(dāng)然也可以添加任務(wù)到這個隊(duì)列,但是它不會執(zhí)行,直到調(diào)用這個方法。因此必須保持平衡,使所有的暫停操作都有匹配的恢復(fù)操作。3. 當(dāng)?shù)却{(diào)用返回時(shí),使用資源繼續(xù)工作。dispatch_semaphore_signal(fd_sema)。// 完成工作后釋放這個組dispatch_release(group)。 Source介紹Dispatch Source是協(xié)調(diào)底層特殊系統(tǒng)事件的基本類型。在配置一個 調(diào)度源時(shí),需要指定想要監(jiān)聽的事件、調(diào)度隊(duì)列以及用于處理事件的代碼。為了防止隊(duì)列中事件太多發(fā)生積壓,調(diào)度源實(shí)現(xiàn)了一種合并機(jī)制。2. 配置調(diào)度源: a) 給它分配一個事件處理操作;b) 對于定時(shí)器源,使用dispatch_source_set_timer函數(shù)設(shè)置定時(shí)器信息。事件處理操作可以是一個函數(shù)或者block,然后可以用dispatch_source_set_event_handler或 dispatch_source_set_event_handler_f 函數(shù)進(jìn)行設(shè)置。// 基于block的事件處理操作void (^dispatch_block_t)(void)// 基于函數(shù)的時(shí)間處理操作void (*dispatch_function_t)(void *)在事件處理操作中,可以從調(diào)度源提供的事件中獲取事件的相應(yīng)信息。下面列出了可以在事件處理程序中獲取有關(guān)事件信息的函數(shù)[15]。多數(shù)類型的調(diào)度源不需要取消處理操作,除非對調(diào)度源有自定義的行為并且需要在釋放時(shí)執(zhí)行。不過也可以使用dispatch_set_target_queue函數(shù)在任何時(shí)候修改目標(biāo)隊(duì)列。雖然這樣可以代替context指針,但是應(yīng)該謹(jǐn)慎地使用這種方式。例如調(diào)度源應(yīng)用于單一全局事件時(shí)
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1