IOS開(kāi)發(fā)-多線(xiàn)程隊(duì)列測(cè)試代碼
直接貼測(cè)試代碼了。
當(dāng)前考慮的問(wèn)題:
1.隊(duì)列有多少個(gè)消費(fèi)者
2.添加到隊(duì)列的新task是同步運(yùn)行(當(dāng)前線(xiàn)程阻塞)還是異步(當(dāng)前線(xiàn)程不阻塞)
3.多個(gè)隊(duì)列之間的調(diào)度(此文章未涉及)
//
// 單線(xiàn)程和多線(xiàn)程并發(fā)隊(duì)列測(cè)試(同步和異步)
//
// 基礎(chǔ)原理:
// 1)隊(duì)列:
// 1.1 dispatch_queue_t 是一個(gè)隊(duì)列,一個(gè)FIFO的消費(fèi)隊(duì)列
// 1.2 消費(fèi)者:隊(duì)列配置的運(yùn)行線(xiàn)程
// 1.3 被消費(fèi)對(duì)象: 添加到隊(duì)列中的運(yùn)行任務(wù)(block等)
// 1.4 運(yùn)行任務(wù):將任務(wù)放到隊(duì)列中,等待消費(fèi)者消費(fèi)
// 2)同步,異步 (對(duì)于任務(wù)) (此處的運(yùn)行指將任務(wù)發(fā)入到請(qǐng)求隊(duì)列中)
// 2.1 同步:A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)等待B任務(wù)運(yùn)行完才能運(yùn)行
// 2.2 異步: A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)不等待并且繼續(xù)運(yùn)行,B任務(wù)也運(yùn)行
// 假設(shè):
// ATask: 運(yùn)行fooA的Block
// BTask: 運(yùn)行fooB的Block
//
//
// 總結(jié):
// 不管單線(xiàn)程或多線(xiàn)程,同步或異步,一定要聯(lián)系請(qǐng)求隊(duì)列考慮
#import "TestQueueSi.h"
@interface TestQueueSi ()
@property (strong,nonatomic) dispatch_queue_t serialQueue;
@property (strong,nonatomic) dispatch_queue_t concurrentQueue;
@end
@implementation TestQueueSi
- (instancetype)init {
self = [super init];
if(self) {
_serialQueue = dispatch_queue_create("chenhh.serialQueue", DISPATCH_QUEUE_SERIAL);
_concurrentQueue = dispatch_queue_create("chenhh.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
/**
QUEUE_SERIAL(單線(xiàn)程) 同步
死鎖崩潰
1.ATask運(yùn)行,同步加入BTask
2.BTask加入到請(qǐng)求隊(duì)列中,可是沒(méi)有其他空余線(xiàn)程(ATask線(xiàn)程在 等待BTask),BTask等待空余線(xiàn)程,
3.死鎖發(fā)生
*/
- (void)testSerialQueueSync {
dispatch_sync(_serialQueue,^{
[self fooA];
dispatch_sync(_serialQueue,^{
[self fooB];
});
[self fooA];
});
}
/**
QUEUE_CONCURRENT(多線(xiàn)程) 同步
正常運(yùn)行
1.ATask運(yùn)行,同步加入BTask,Atask線(xiàn)程等待
2.BTask加入到請(qǐng)求隊(duì)列中,有其他空余線(xiàn)程(ATask線(xiàn)程在等待BTask),BTask運(yùn)行
3.BTask運(yùn)行結(jié)束,ATask停止等待,繼續(xù)運(yùn)行
*/
- (void)testConcurrentQueueSync {
dispatch_sync(_concurrentQueue,^{
[self fooA];
NSLog(@"first");
// 同步 需要等待運(yùn)行結(jié)果
dispatch_sync(_concurrentQueue,^{
[self fooB];
});
// 等待同步代碼完成,再運(yùn)行
[self fooA];
});
}
/*
QUEUE_SERIAL(單線(xiàn)程) 異步
正常
1.ATask運(yùn)行,異步加入BTask,Atask線(xiàn)程繼續(xù)運(yùn)行不等待
2.BTask加入到請(qǐng)求隊(duì)列中,沒(méi)有其他空余線(xiàn)程(ATask線(xiàn)程在正常運(yùn)行),BTask等待空余
3.ATask運(yùn)行完成,線(xiàn)程空出,BTask運(yùn)行
*/
- (void)testSerialQueueAsync {
dispatch_async(_serialQueue,^{
[self fooA];
dispatch_async(_serialQueue,^{
[self fooB];
});
[self fooA];
});
}
/**
QUEUE_CONCURRENT(多線(xiàn)程) 異步
正常運(yùn)行
1.ATask運(yùn)行,同步加入BTask,Atask線(xiàn)程繼續(xù)運(yùn)行不等待
2.BTask加入到請(qǐng)求隊(duì)列中,有其他空余線(xiàn)程(ATask等線(xiàn)程在正常運(yùn)行),BTask運(yùn)行(ABTask同時(shí)運(yùn)行)
*/
- (void)testConcurrentQueueAsync {
dispatch_async(_concurrentQueue,^{
[self fooA];
// 同步 需要等待運(yùn)行結(jié)果
dispatch_async(_concurrentQueue,^{
[self fooB];
});
// 等待同步代碼完成,再運(yùn)行
[self fooA];
});
}
- (void)fooA {
NSLog(@" ************ fooA ************ ");
}
- (void)fooB {
NSLog(@" ************ fooB ************ ");
}
@end
相關(guān)文章
Objective-C的緩存框架EGOCache在iOS App開(kāi)發(fā)中的使用
這篇文章主要介紹了Objective-C的緩存框架EGOCache在iOS App開(kāi)發(fā)中的使用,重點(diǎn)講解了EGOCache對(duì)緩存過(guò)期時(shí)間的檢測(cè)及處理,需要的朋友可以參考下2016-05-05
iOS 統(tǒng)計(jì)Xcode項(xiàng)目代碼行數(shù)的實(shí)例
下面小編就為大家分享一篇iOS 統(tǒng)計(jì)Xcode項(xiàng)目代碼行數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
iOS Xcode升級(jí)Xcode15報(bào)錯(cuò)SDK does not contain
這篇文章主要為大家介紹了iOS Xcode 升級(jí)Xcode15報(bào)錯(cuò): SDK does not contain 'libarclite'解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
iOS開(kāi)發(fā)一個(gè)好看的ActionSheet
本篇文章通過(guò)代碼分享和圖文形式教給大家用IOS寫(xiě)一個(gè)好看的ActionSheet過(guò)程以及注意事項(xiàng),需要的朋友參考下吧。2018-01-01
iOS基于UIScrollView實(shí)現(xiàn)滑動(dòng)引導(dǎo)頁(yè)
這篇文章主要為大家詳細(xì)介紹了iOS基于UIScrollView實(shí)現(xiàn)滑動(dòng)引導(dǎo)頁(yè)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
iOS 本地視頻和網(wǎng)絡(luò)視頻流播放實(shí)例代碼
本篇文章主要介紹了iOS 本地視頻和網(wǎng)絡(luò)視頻流播放實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
iOS使用UIBezierPath實(shí)現(xiàn)ProgressView
這篇文章主要為大家詳細(xì)介紹了iOS使用UIBezierPath實(shí)現(xiàn)ProgressView,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
iOS開(kāi)發(fā)retina屏幕下的點(diǎn)與像素關(guān)系詳解
這篇文章主要為大家介紹了iOS開(kāi)發(fā)retina屏幕下的點(diǎn)與像素關(guān)系詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

