IOS开发-多线程队列测试代码
程序员文章站
2023-12-18 10:26:10
直接贴测试代码了。
当前考虑的问题:
1.队列有多少个消费者
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞)
3.多个队列之间的调度...
直接贴测试代码了。
当前考虑的问题:
1.队列有多少个消费者
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞)
3.多个队列之间的调度(此文章未涉及)
// // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_queue_t 是一个队列,一个fifo的消费队列 // 1.2 消费者:队列配置的运行线程 // 1.3 被消费对象: 添加到队列中的运行任务(block等) // 1.4 运行任务:将任务放到队列中,等待消费者消费 // 2)同步,异步 (对于任务) (此处的运行指将任务发入到请求队列中) // 2.1 同步:a任务在运行时,插入b任务,a任务等待b任务运行完才能运行 // 2.2 异步: a任务在运行时,插入b任务,a任务不等待并且继续运行,b任务也运行 // 假设: // atask: 运行fooa的block // btask: 运行foob的block // // // 总结: // 不管单线程或多线程,同步或异步,一定要联系请求队列考虑 #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(单线程) 同步 死锁崩溃 1.atask运行,同步加入btask 2.btask加入到请求队列中,可是没有其他空余线程(atask线程在 等待btask),btask等待空余线程, 3.死锁发生 */ - (void)testserialqueuesync { dispatch_sync(_serialqueue,^{ [self fooa]; dispatch_sync(_serialqueue,^{ [self foob]; }); [self fooa]; }); } /** queue_concurrent(多线程) 同步 正常运行 1.atask运行,同步加入btask,atask线程等待 2.btask加入到请求队列中,有其他空余线程(atask线程在等待btask),btask运行 3.btask运行结束,atask停止等待,继续运行 */ - (void)testconcurrentqueuesync { dispatch_sync(_concurrentqueue,^{ [self fooa]; nslog(@"first"); // 同步 需要等待运行结果 dispatch_sync(_concurrentqueue,^{ [self foob]; }); // 等待同步代码完成,再运行 [self fooa]; }); } /* queue_serial(单线程) 异步 正常 1.atask运行,异步加入btask,atask线程继续运行不等待 2.btask加入到请求队列中,没有其他空余线程(atask线程在正常运行),btask等待空余 3.atask运行完成,线程空出,btask运行 */ - (void)testserialqueueasync { dispatch_async(_serialqueue,^{ [self fooa]; dispatch_async(_serialqueue,^{ [self foob]; }); [self fooa]; }); } /** queue_concurrent(多线程) 异步 正常运行 1.atask运行,同步加入btask,atask线程继续运行不等待 2.btask加入到请求队列中,有其他空余线程(atask等线程在正常运行),btask运行(abtask同时运行) */ - (void)testconcurrentqueueasync { dispatch_async(_concurrentqueue,^{ [self fooa]; // 同步 需要等待运行结果 dispatch_async(_concurrentqueue,^{ [self foob]; }); // 等待同步代码完成,再运行 [self fooa]; }); } - (void)fooa { nslog(@" ************ fooa ************ "); } - (void)foob { nslog(@" ************ foob ************ "); } @end