亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        iOS系統(tǒng)中多線程技術的研究

        2017-06-01 23:38:46陳偉卜慶凱
        電腦知識與技術 2017年8期
        關鍵詞:多線程

        陳偉 卜慶凱

        摘要:軟件在設計開發(fā)過程中,都會考慮同時執(zhí)行多個任務的能力,需要通過多線程的技術來實現(xiàn)。同樣在lOS系統(tǒng)中,應用軟件也需要具有并發(fā)執(zhí)行多個任務的能力。文章內容從多線程的概率出發(fā),主要介紹了iOS系統(tǒng)中使用最廣泛的三種多線程技術,即NSThread、GCD、NSOperation。并分別對三種技術的使用做了進一步的研究與說明,介紹了各個多線程技術在使用過程中的一些優(yōu)缺點,以及開發(fā)人員在實際應用過程中需要注意的地方。對從事iOS軟件編程方面對多線程技術存在困惑的人具有一定的幫助和指導作用。

        關鍵詞:iOS系統(tǒng);多線程;NSThread;GCD;NSOperation

        中圖分類號:TP311.1 文獻標識碼:A 文章編號:1009-3044(2017)08-0078-03

        1背景

        目前,阻礙計算機性能充分發(fā)揮的主要因素是中心處理器的運行速度。在計算機技術快速發(fā)展的前提下,單核處理器已經(jīng)完全滿足不了我們日常的使用需求。在這種背景下,一些芯片制造商紛紛開始轉向多核處理器的設計,使計算機擁有同時執(zhí)行多個任務的能力。美國蘋果公司的iPhone手機近幾年如此之火爆,不僅是因為它漂亮的外表和豐富的軟件界面,更是因為它充分利用了多核處理器的核心優(yōu)勢。在任何時候都可以執(zhí)行系統(tǒng)相關的任務,而且應用程序也可以通過使用多線程技術流暢的執(zhí)行多個任務,使得iPhone具有卓越的性能和優(yōu)秀的用戶體驗。通過使用多線程技術,可以讓比較耗時的操作放在子線程中執(zhí)行,保證主線程只需要執(zhí)行和用戶界面相關的操作,不會有一種界面很“卡”的感覺,確保軟件在使用過程中流暢性較好,增強了用戶體驗性能。

        2多線程的介紹

        2.1進程和線程

        簡單點概況,進程就是計算機系統(tǒng)中正在運行的程序,是CPU分配資源的基本單位。進程與線程之間是相互獨立的概念,每一個進程只在受保護的專屬內存空間內運行,而且同一個進程內的線程共享進程中的數(shù)據(jù)資源。比如我們在電腦上同時打開瀏覽器與音樂播放器,系統(tǒng)就會自動開啟兩個進程。

        線程是CPU建立在進程基礎之上執(zhí)行任務的最小單位,且每個進程至少有一條主線程,進程中的所有任務都是在線程中執(zhí)行的。比如用瀏覽器瀏覽網(wǎng)頁,播放器播放音樂,都需要在每個進程中的線程去執(zhí)行。每個線程中執(zhí)行任務的方式是串行的,即在同一時間只可能執(zhí)行一個任務。執(zhí)行多個任務時也只能按照任務的先后順序一個一個的執(zhí)行。在Mac和iOS系統(tǒng)中運行的應用程序每多創(chuàng)建一個新的線程都需要占用512KB(主線程占用1MB)的內存和消耗一定的CPU時間。

        2.2多線程

        多線程是指讓應用程序的內部多個線程并發(fā)執(zhí)行任務的一種能提高執(zhí)行效率與資源利用率的技術。同一時間段內CPU只能處理一條線程上的任務,而多線程并發(fā)執(zhí)行的實質是CPU快速地在多條線程之間的相互切換,如果線程調度的時間足夠快,就造成一種多線程并發(fā)執(zhí)行的假象用。如果一個應用程序線程開的太多會消耗大量的CPU資源,降低程序的性能,每條線程的執(zhí)行頻率和效率也會大大地降低。

        每個lOS應用程序運行后,默認開啟一條主線程(或稱之為UI線程),其作用是顯示和刷新UI(User Interface/用戶界面),以及處理UI事件(比如點擊事件、滾動事件、拖拽事件等)。

        3iOS系統(tǒng)中三種多線程技術

        iOS系統(tǒng)中多線程技術的實現(xiàn)方案總共有四種,分別為Pthread、NSThread、GCD(Grand Central Dispatch)、NSOperation技術。Pthread技術由于其使用難度大等一系列的缺陷,目前在實際的APP開發(fā)過程中基本上不使用這種淘汰的技術。因此主要以介紹NSThread、GCD、NSOperation技術的研究為主。

        3.1 NSThread多線程技術

        NSThread是OS X和iOS系統(tǒng)中都提供的一個以輕量級實現(xiàn)的線程對象。NSThread適應于一些輕量級較簡單的任務,不過用戶需要自己管理線程生命周期以及線程之間的同步。NSThread沒有涉及到線程狀態(tài)、依賴性、線程間的同步問題,當多個線程訪問同一份資源時會出現(xiàn)數(shù)據(jù)錯亂的現(xiàn)象,這時我們又要使用互斥鎖來解決這個問題,而這又會消耗大量的CPU資源。

        NSThread的初始化方法

        3)動態(tài)方法

        動態(tài)方法在初始化后,需要手動的調用strut方法才能開啟該線程的真正創(chuàng)建。

        其中,target:selector消息發(fā)送的目標對象;selector:線程選擇調用的方法,最多只能接收一個參數(shù);argument:傳給selector的唯一參數(shù),也可以是nil。

        4)靜態(tài)方法

        5)隱式創(chuàng)建線程

        靜態(tài)方法和隱式方法在代碼執(zhí)行后會默認開啟一條線程執(zhí)行任務。

        3.2GCD多線程技術

        GCD(Grand Center Dispatch)的實現(xiàn)是基于c語言的API。GCD是一個大的主題,負責自動創(chuàng)建管理線程的生命周期和調度執(zhí)行任務,提高代碼的執(zhí)行效率與多核的利用率。GCD的API很大程度上基于block,當配合block使用時,GCD能發(fā)揮其最大能力。通過使用GCD技術管理線程,工程師可以不需要再編寫線程代碼,只需要專注于在block或方法中編寫執(zhí)行某項功能的代碼。隊列這個概念為GCD的實現(xiàn)提供了方便,其實質是將長期運行的任務拆分成多個工作單元,并將這些單元添加到dispath queue(調度隊列)中,系統(tǒng)會自動管理這些dispathqueue的生命周期以及任務的執(zhí)行,不需要我們手動管理后臺線程。而dispath queue也嚴格遵循FIFO(先進先出)原則,串行或并發(fā)地執(zhí)行任務。

        1)獲得全局并發(fā)dispatch queue

        并發(fā)dispateh queue可以同時并行的按照queue加入的先后順序執(zhí)行多個任務。系統(tǒng)通常會默認的提供三個全局享用的并發(fā)dispateh queue給每個應用程序,三個queue的區(qū)別是優(yōu)先級的不同。這些queue不用顯式地創(chuàng)建,只需要通過dis-patch_get_global_queue函數(shù)就可以獲取到這三個queue。

        圖4中第一個參數(shù)用于指定線程的優(yōu)先級,分別使用DIS-PATCH_QUEUE_PRIORITY_HIGH和D/SPATCH_QUEUE_PRI-ORITY_LOW兩個常量來獲取高和低優(yōu)先級的兩個queue;第二個參數(shù)默認0即可。

        2)創(chuàng)建串行dispatch queue

        創(chuàng)建方法:dispateh_queue_create(const char*_Nullable la-bel,dispatch_queue_attr_t_Nullable attr);

        函數(shù)的第一個參數(shù)是一個標簽,蘋果公司建議我們使用倒置域名來命名隊列,比如“com.apple.www”。第二個參數(shù)是隊列的類型,只能傳參數(shù)DISPATCH_QUEUE_SERIAL(串行隊列)和NULL,不能傳DISPATCH_QUEUE_CONCURRENT(并發(fā)隊列)。串行隊列一次只能執(zhí)行一個任務,只有當前任務已經(jīng)執(zhí)行完成才會啟動下一個任務的執(zhí)行;并發(fā)隊列則會盡可能多地啟動任務并發(fā)執(zhí)行,并且只能在異步函數(shù)下有效。

        3)添加任務到queue

        異步函數(shù):dispatch_async(dispatch_queue_t queue,dis-patch_block_t blockk

        同步函數(shù):dispatch_sync(dispatch_queue_t queue,DIS-PA TCH_NOESCAPE dispateh_block_t block);

        其中第一個參數(shù)表示已經(jīng)創(chuàng)建的隊列名稱,第二個參數(shù)是需要實現(xiàn)某些具體功能的代碼段(即block任務)。異步函數(shù)具備開啟新線程執(zhí)行任務的能力,在調用時會立即返回,同時隊列會在輪到這個block執(zhí)行時后臺異步執(zhí)行這個任務,這樣就可以調用線程繼續(xù)去做其它事情。而同步函數(shù)不具備開新線程的能力,在調用時會在當前線程等待block中的代碼執(zhí)行完成后返回,容易出現(xiàn)阻塞當前調用線程的現(xiàn)象,而在串行queue中會導致死鎖。

        在傳統(tǒng)的多線程編程中,你可能有一個對象要被多個線程使用,這時候你需要一個互斥鎖來保護這個對象。然而在GCD中,用戶隊列完全可以替代互斥鎖來完成同步機制,就不可能意外寫出具有不成對Lock(鎖)的代碼。

        3.3 NSOperation和NSOperationQueue

        配合使用NSOperation和NSOperationQueue也能實現(xiàn)多線程的功能。NSOperation實例中已經(jīng)封裝好了開發(fā)過程中需要執(zhí)行的操作以及所需的數(shù)據(jù),能夠以并發(fā)或非并發(fā)的方式執(zhí)行這個操作。NSOperation是一個抽象的基類,本身不具備把操作進行封裝的能力,必須使用它的子類才能實現(xiàn)。目前有三種可以使用NSOperation子類的方法,F(xiàn)oundation框架為我們提供了兩個具體子類直接供我們使用,即NShwocationOperation和NSBlockOperation方法;另外一個是自定義子類繼承自NSOper-ation,實現(xiàn)內部相應的方法實現(xiàn)。

        1)創(chuàng)建NSInvocationOperation對象

        創(chuàng)建方法:-(nullable instancetype)init WithTarget:(id)targetselector:(SEL)sel object:(nullable id)arg;

        其中,三個參數(shù)分別表示目標對象、調用方法以及方法需要傳遞的參數(shù)。在使用時需要調用start方法開始執(zhí)行操作。默認情況下,調用start方法后并不會開一條新線程去執(zhí)行操作,而是在當前線程同步執(zhí)行操作,直到任務完成。如果想要中途取消操作,可以調用cancel方法。

        上面是調用self均test方法,通過調用start方法開始執(zhí)行任務。

        2)創(chuàng)建NSBlockOperation對象

        創(chuàng)建方法:+(instancetype)blockOperationWithBlock:(void (^)(void))block;

        這種方法能夠并發(fā)地執(zhí)行一個或多個block對象,所有相關的block都執(zhí)行完之后,操作才算完成。其次,通過調用ad-dExecutionBlock:方法可以添加更多的block操作。

        圖7中首先創(chuàng)建了一個名稱為operation的NSBlockOpera-tion對象,通過addExecationBlock方法添加三個新的block操作,即NSBlockOperation封裝的操作數(shù)大于1,這樣可以使4個block操作并發(fā)的在不同線程中執(zhí)行。

        NSOperation雖然可以調用start方法來執(zhí)行任務,但默認是同步執(zhí)行的,如果將NSOperation添加到NSOperationQueue(操作隊列)中,系統(tǒng)會自動異步執(zhí)行NSOperation中的操作。

        對于上述NSlnvocationOperation和NSBlockOperation方法,我們需要創(chuàng)建一個NSOperationQueue對象,將封裝好操作代碼的NSOperation對象添加到NSOperationQueue中,系統(tǒng)會自動將NSOperationQueue中的NSOperation對象提取出來,然后將NSOperation封裝的操作放到一條新線程中執(zhí)行。

        3)自定義NSOperation對象

        如果NShwocationOperation和NSBlockOperation對象不能滿足我們的任務需求,可以自定義一個直接繼承自NSOperation的對象,并在其中添加任何想要的方法。

        圖8中的CHWOperation是我們自定義的繼承自NSOpera-tion的對象,在定義非并發(fā)的NSOperation對象只需要重載-(Void)main方法,在這個方法里面添加執(zhí)行主任務的代碼,并正確地響應任務取消事件;對于并發(fā)NSOperation,需要重寫NSOperation的多個基本方法進行實現(xiàn)。

        4)其他相關用法

        有時,僅僅依靠這些方法并不能滿足我們的需求,所以我們需要通過其他方法使任務更加合理有序的執(zhí)行。通過-(NSInte-ger)maxConcurrentOperationCount方法,可以設置同時執(zhí)行任務的最大并發(fā)數(shù)。當隊列有取消、暫停、恢復需求時,調用-(void)cancelAllOperatious方法取消所有隊列正在執(zhí)行的任務,-(void)cancel方法取消單個隊列操作,而NSOperation對象會定期地調用isCancelled方法檢測操作是否已經(jīng)被取消,這種方法本身非常輕量即使是頻繁地調用也不會產(chǎn)生比較大的性能損失;設置Suspended方法的BOOL值,YES表示暫停,NO表示取消。

        NSOperation之間還可以設置依賴來保證任務的執(zhí)行順序,比如要讓操作B在操作A完成之后再執(zhí)行,可以設置[opera-tionB addDependency:operationA],即操作B依賴于操作A。同樣在不同queue之間的NSOperation也可以創(chuàng)建依賴關系。不過值得我們注意的是任何兩個操作之間不能相互依賴。

        4結束語

        根據(jù)在iOS開發(fā)學習過程中出現(xiàn)的問難,本文詳細討論了iOS系統(tǒng)中三種多線程技術的使用,對于在iOS編程中對多線程有疑問的開發(fā)者具有一定的幫助作用。而通過對三種多線程技術的研究比較,在實際的開發(fā)過程中,開發(fā)者應該盡可能的少用需要人工管理生命周期的NSThread技術,轉而使用具有自動管理生命周期功能的GCD和NSOperation多線程技術。此外,iOS系統(tǒng)目前已經(jīng)更新到了iOS10,以后技術還會不斷提高,目前的多線程技術也肯定滿足不了以后的軟件需求。所以,開發(fā)人員需要不斷提高自身的技術能力,結合Apple公司提供的方法,研究出更加完善的多線程技術,以此來推動lOS系統(tǒng)的不斷發(fā)展。

        猜你喜歡
        多線程
        Java多線程同步機制在網(wǎng)絡售票系統(tǒng)中的應用
        科技資訊(2016年29期)2017-02-28 09:30:34
        Java并發(fā)工具包對并發(fā)編程的優(yōu)化
        基于多線程文件傳輸關鍵技術研究與實現(xiàn)
        網(wǎng)頁爬蟲技術的關鍵技術研究探索
        一種基于多線程的高速磁盤鏡像算法
        iOS并發(fā)程序設計中幾種方法的特點及使用技巧研究
        HTM L5 Web WOrker技術及應用研究
        電站鍋爐煤粉參數(shù)遠程監(jiān)控系統(tǒng)的軟件設計與實現(xiàn)
        一種高并發(fā)認證服務器的實現(xiàn)
        一種低開銷的并行重復數(shù)據(jù)刪除算法
        軟件導刊(2015年8期)2015-09-18 12:59:11
        99精品国产一区二区三区a片| 美女被黑人巨大入侵的的视频| 久久精品国产亚洲av天| 色吊丝中文字幕| 色综合久久天天综线观看| 扒下语文老师的丝袜美腿| 精品人妻久久一日二个| 娜娜麻豆国产电影| 漂亮人妻被黑人久久精品| 国产免费三级三级三级| 免费国产一区二区视频| 51看片免费视频在观看| 日本高清一区二区三区水蜜桃| 国产三级黄色片子看曰逼大片| 日韩人妻精品视频一区二区三区| av无码av天天av天天爽| 99精品视频免费热播| 视频精品亚洲一区二区| 日本区一区二区三视频| 欧美一区二区三区红桃小说| 亚洲欧洲精品国产二码| 神马不卡影院在线播放| 久久久久久久亚洲av无码| 丰满少妇愉情中文字幕18禁片| 国产午夜亚洲精品不卡免下载| 国产精品一区av在线| 黑森林福利视频导航| 国产福利酱国产一区二区| 久久免费看视频少妇高潮| 免费观看mv大片高清| 亚洲精品久久久久中文字幕二区| 亚洲午夜无码久久久久软件| 亚洲av色图一区二区三区| 丰满爆乳在线播放| 亚洲国产99精品国自产拍| 国产一区二区三区在线爱咪咪| 午夜不卡无码中文字幕影院| 免费无码av片在线观看网址| 一区二区高清视频在线观看| 日韩少妇人妻中文字幕| 久久99久久99精品免观看 |