真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios多線程開發(fā)實例,ios單線程嗎

iOS詳解多線程(實現(xiàn)篇——pThread)

上一節(jié)中,我們探究了OC中重要的實現(xiàn)多線程的方法——NSOperation。本節(jié)中,我們了解一下不常用的一種創(chuàng)建多線程的方式——pThread。

我們提供的服務(wù)有:網(wǎng)站制作、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、舟曲ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的舟曲網(wǎng)站制作公司

相關(guān)鏈接:

NSOpreation鏈接: iOS詳解多線程(實現(xiàn)篇——NSOperation)

GCD鏈接: iOS詳解多線程(實現(xiàn)篇——GCD)

NSThread鏈接: 詳解多線程(實現(xiàn)篇——NSThread)

多線程概念篇鏈接: 詳解多線程(概念篇——進程、線程以及多線程原理)

源碼鏈接:

1.NSThread(OC)

2.GCD(C語言)

3.NSOperation(OC)

5.其他實現(xiàn)多線程方法

pThread并不是OC特有的實現(xiàn)多線程的方法,而是Unix、Linux還有Windows都通用的一種實現(xiàn)多線程的方式。

pThread的全稱是POSIX threads,是線程的 POSIX 標(biāo)準(zhǔn)。

pThread是C語言的,在iOS的開發(fā)中極少使用。

使用之前,記得先導(dǎo)入頭文件

運行結(jié)果:

從結(jié)果可以看出,開啟了新的線程,執(zhí)行任務(wù)。

pthread_create() 創(chuàng)建一個線程

pthread_exit() 終止當(dāng)前線程

pthread_cancel() 中斷另外一個線程的運行

pthread_join() 阻塞當(dāng)前的線程,直到另外一個線程運行結(jié)束

pthread_attr_init() 初始化線程的屬性

pthread_attr_setdetachstate() 設(shè)置脫離狀態(tài)的屬性(決定這個線程在終止時是否可以被結(jié)合)

pthread_attr_getdetachstate() 獲取脫離狀態(tài)的屬性

pthread_attr_destroy() 刪除線程的屬性

pthread_kill() 向線程發(fā)送一個信號

由于pThread我們基本用不到,所以不再做深入研究。

ios多線程同步異步、串行并行隊列、死鎖

概念:隊列只負(fù)責(zé)任務(wù)的調(diào)度,而不負(fù)責(zé)任務(wù)的執(zhí)行,任務(wù)是在線程中執(zhí)行的。(可以理解成任務(wù)是放在隊列里面的,要被調(diào)度到線程中去執(zhí)行)

特點:隊列先進先出,排在前面的任務(wù)最先執(zhí)行。

分類:隊列分為串行、并行、主隊列、全局隊列。

任務(wù)的執(zhí)行是在線程上去執(zhí)行的。分為同步和異步。

所以就可以分成:串行隊列同步執(zhí)行、串行隊列異步執(zhí)行、并行隊列同步執(zhí)行、并行隊列異步執(zhí)行。

GCD實現(xiàn)原理:

GCD有一個底層線程池,這個池中存放的是一個個的線程。之所以稱為“池”,是因為這個“池”中的線程是可以重用的,當(dāng)一段時間后沒有任務(wù)在這個線程上執(zhí)行的話,這個線程就會被銷毀。注意:開多少條線程是由底層線程池決定的(線程建議控制再3~5條),池是系統(tǒng)自動來維護,不需要我們程序員來維護。

我們只關(guān)心的是向隊列中添加任務(wù),隊列調(diào)度即可。

定義:調(diào)用方法(viewDidLoad)的隊列(主隊列)恰好是同步操作(dispatch_sync)所針對的隊列(dispatch_get_main_queue)。

示例1:

輸出結(jié)果:

dispatch_sync 和 dispatch_async 區(qū)別:

dispatch_async(queue,block) async 異步隊列,dispatch_async 函數(shù)會立即返回, block會在后臺異步執(zhí)行。

dispatch_sync(queue,block) sync 同步隊列,dispatch_sync 函數(shù)不會立即返回,及阻塞當(dāng)前線程,等待 block同步執(zhí)行完成。

以上例子就會死鎖,因為viewDidLoad的這個任務(wù)是被主隊列調(diào)用的的,而dispatch_sync不會立即返回,而是先阻塞當(dāng)前的主線程,直到這個block執(zhí)行完畢,因為主線程被阻礙了,啥也干不了了(只有一個線程還被阻塞了,就會造成死鎖),所以這個block就永遠沒有機會執(zhí)行了,所以就會造成死鎖。

示例2:

輸出結(jié)果:

示例2就不會造成死鎖,因為dispatch_async會立即返回,所以會先輸出3,而異步會創(chuàng)建一個新的線程來執(zhí)行block塊,所以2最后輸出。但是2和3的順序不一定。

示例3:

輸出結(jié)果:

示例3也不會造成死鎖,因為dispatch_sync不會立即返回,而是先阻塞主線程,再將任務(wù)2加入到一個全局隊列的一個線程上去執(zhí)行,執(zhí)行完之后返回到主隊列,此時主線程不在阻塞,再繼續(xù)執(zhí)行任務(wù)3。

示例4:

輸出結(jié)果:

因為dispatch_async不會等待,所以順序是1-4-2-3-5或1-2-4-3-5,其中任務(wù)1和4是在主線程執(zhí)行的,而2是在全局隊列上被調(diào)用的,執(zhí)行完2之后,會阻塞當(dāng)前的線程(全局隊列上的),緊接著會回到主隊列上的主線程上執(zhí)行任務(wù)3,任務(wù)3執(zhí)行完之后,會繼續(xù)執(zhí)行5,此時全局隊列上的線程也不堵塞了。

注意:線程同步阻塞后不一定能造成死鎖,還要看看還有沒有其他線程去執(zhí)行那個block,如果能有,就能解鎖阻塞的線程,繼續(xù)執(zhí)行任務(wù)。如果沒有,那就是死鎖了。

示例5:

輸出結(jié)果:

最終結(jié)果還是會導(dǎo)致死鎖,因為dispatch_queue_create創(chuàng)建隊列的時候傳入NULL默認(rèn)是串行隊列,所以執(zhí)行任務(wù)2之后,會阻塞掉當(dāng)前線程,直到任務(wù)3的block執(zhí)行完成,又因為當(dāng)前線程被阻塞掉了,block也無法執(zhí)行,導(dǎo)致相互等待造成死鎖

示例6:

輸出結(jié)果:=5

因為self.num++操作是異步的,不一定能立馬返回結(jié)果,所以在進入下次while循環(huán)的時候,self.num(主線程)可能還是0,所以循環(huán)肯定至少5次,最理想的情況下,5次全部都返回結(jié)果,而NSLog是會等待異步結(jié)果返回才會打印,所以輸出結(jié)果=5

示例7:

輸出結(jié)果為:1000

因為總共循環(huán)1000次,并不是每次結(jié)果都有返回,所以最終打印的self.num肯定小于1000

參考鏈接

NSOperation'>iOS多線程GCD任務(wù)取消->NSOperation

在多線程開發(fā)中,我們常用到GCD,這里探討一下GCD任務(wù)的取消:

1.在iOS 8以后,系統(tǒng)給我們提供了這樣的取消函數(shù) dispatch_block_cancel,不過這個也只能用于dispatch_block_create創(chuàng)建的dispatch_block_t,我們試驗一下:

這時肯定是任務(wù)都會執(zhí)行的

接下來,把注釋的那一行 dispatch_block_cancel(block1);打開,看看效果:

我們發(fā)現(xiàn)block1確實被取消掉了。這是dispatch_block_cancel的用法。

2.很多時候,我們的場景不會去用dispatch_block_create創(chuàng)建dispatch_block_t,這個時候我們?nèi)粝肴∠粋€任務(wù),可以考慮用一個條件來做,滿足條件則執(zhí)行此任務(wù),不滿足則不執(zhí)行,舉個例子:

效果如下:

寫到這里,這兒其實還隱藏了一個知識點,就是block的變量捕獲,有興趣或是不理解的朋友可以研究一下。(如下,為何輸出不是20而是10)

3.過渡到NSOperation

NSOperation是對GCD的封裝,底層也是GCD。

NSOperation給我們封裝了更多的api,這是我在Xcode中提出來的:

我們可以發(fā)現(xiàn)它有狀態(tài)屬性,有取消方法,也有添加依賴方法等...這里我們還是先說取消吧,下面來給大家寫個demo:

這時輸出是:

因為正在執(zhí)行的任務(wù),NSOperation也是不能取消的,所以也是需要將cancel在start前調(diào)用的(就如同滿足一個條件是否需要cancel一樣,也可以滿足條件不調(diào)用start)

IOS多線程安全(線程鎖)

線程的不安全是由于多線程訪問和修改共享資源而引起的不可預(yù)測的結(jié)果。

ios多線程開發(fā)中為保證線程的安全常用到的幾種鎖: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。

WEAKSELF typeof(self) __weak weakSelf = self;

NSLock 是OC層封裝底層線程操作來實現(xiàn)的一種鎖,繼承NSLocking協(xié)議。不能迭代加鎖,如果發(fā)生兩次lock,而未unlock過,則會產(chǎn)生死鎖問題。

以車站購票為例,多個窗口同時售票(同步),每個窗口有人循環(huán)購票:

原子操作

原子操作是指不可打斷的操作,也就是說線程在執(zhí)行操作的過程中,不會被操作系統(tǒng)掛起,而是一定會執(zhí)行完,

變量屬性Property中的原子定義

一般我們定義一個變量@property (nonatomic ,strong)NSLock *lock;nonatomic:非原子性,不會為setter方法加鎖,適合內(nèi)存小的移動設(shè)備;atomic:原子性,默認(rèn)為setter方法加鎖(默認(rèn)就是atomic),線程安全。

PS: 在iOS開發(fā)過程中,一般都將屬性聲明為nonatomic,盡量避免多線程搶奪同一資源,盡量將加鎖等資源搶奪業(yè)務(wù)交給服務(wù)器。

NSCondition常用于生產(chǎn)者-消費者模式,它繼承了NSLocking協(xié)議,同樣有l(wèi)ock和unlock方法。條件變量有點像信號量,提供了線程阻塞和信號機制,因此可以用來阻塞某個線程,并等待數(shù)據(jù)就緒再喚醒程序。

信號量主要有3個函數(shù),分別是:

注意: 正常的使用順序是先降低然后提高,這兩個函數(shù)通常都是成對出現(xiàn)。

本文主要參考了這篇文章(

),并對其中所能理解的部分進行一一驗證,以前沒怎么寫過類似的,如果有什么做的不好的地方還請大家多多見諒!

(五)iOS開發(fā)之多線程—線程的狀態(tài)

一.狀態(tài)概述

新建線程,線程就緒,執(zhí)行線程,sleep,等待同步鎖

NSThread *thread = [[NSThread alloc] initWithTarget:selfselector:@selector(run)object:nil];

就緒cpu可以調(diào)用執(zhí)行

[thread start];

概圖:

二.控制線程狀態(tài)

1.啟動線程

- (void)start;

//進入就緒狀態(tài)-運行狀態(tài)。當(dāng)線程任務(wù)執(zhí)行完畢,自動進入死亡狀態(tài)

2.阻塞(暫停)線程

+ (void)sleepUntilDate:(NSDate*)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

//進入阻塞狀態(tài)

3.強制停止線程

+ (void)exit;

//進入死亡狀態(tài)

Dome:

iOS ——多線程原理

了解多線程的原理,保證App的質(zhì)量。

1:進程

2:線程

3:進程 線程的關(guān)系與區(qū)別

5:隊列和線程的關(guān)系

沒啥關(guān)系吧

6:線程與RunLoop的關(guān)系

7:影響任務(wù)執(zhí)行的速度的因素

1:多線程原理

2:多線程意義

優(yōu)點

缺點

3:多線程的生命周期

4:線程池的原理

飽和策略 如下:

4:iOS多線程實現(xiàn)方案

pthread :一套通用的多線程API適用于Unix/Linux/Windows等系統(tǒng)跨平臺/可移植使用難度大,C語言,程序員管理,幾乎不用。

NSThread :使用更加面向?qū)ο蠛唵我子?,可直接操作線程對象,

OC語言,程序員管理生命周期,偶爾使用。

GCD :旨在替代NSThread等,線程技術(shù)充分利用設(shè)備的多核,C語言,自動管理生命周期,經(jīng)常使用。

NSOperation :基于GCD(底層是GCD)比GCD多了一些更簡單實用的功能使用更加面向?qū)ο?,OC語言,自動管理生命周期,經(jīng)常使用。

5:GCD和NSOperation的區(qū)別

6:線程間的通訊


文章題目:ios多線程開發(fā)實例,ios單線程嗎
網(wǎng)頁URL:http://weahome.cn/article/dsshech.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部