- dispatch_semaphore:信号量
可以理解为房间里电灯的开关,灯开着的时候,可以做事,灯关闭的时候,不可以做事。
系统为dispatch_semaphore提供了三个函数:
/*
创建信号量,并设置一个总数value
*/
dispatch_semaphore_create(long value);
/*
等待信号
*/
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
/*
发送信号
*/
dispatch_semaphore_signal(dispatch_semaphore_t dsema);
举例说明使用场景
例如一个工人在一个厂房里工作
/*
创建厂房,假设这个厂房里有一个电灯是开着的
*/
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
/*
工人进来厂房,发现有一个电灯亮着,那么他就要工作
(监听到信号量为1,继续进行,并自动执行信号量-1操作;当监听到信号量为0时,原地等待,不会往下进行,且不会对信号量有任何操作)
*/
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
/*
工人在工作,假设他在打印文件
*/
for(int i = 0; i < 10; i ++){
//当他打印到第五份文件的时候,厂房里面的电灯被关闭了,那么他发现没有亮光了,然后他就站在原地,什么都看不见,什么都做不了了
if(i == 4){
//发送信号,告诉工人唯一开着的电灯关闭了
dispatch_semaphore_signal(semaphore);
}
}
使用信号量dispatch_semaphore实现最大并发
//并发
dispatch_queue_t concurrent = dispatch_queue_create("CONCURRENT", DISPATCH_QUEUE_CONCURRENT);
//串行
dispatch_queue_t serial = dispatch_queue_create("SERIAL",DISPATCH_QUEUE_SERIAL);
//最大并发3个任务
dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
for (int i = 0; i < 10; i++) {
dispatch_async(serial, ^{
//等待状态
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//异步执行并发队列
dispatch_async(concurrent, ^{
NSLog(@"沉睡前:%@开始执行任务%d",[NSThread currentThread],i);
sleep(3);
NSLog(@"沉睡后:%@结束执行任务%d",[NSThread currentThread],i);
dispatch_semaphore_signal(semaphore);
});
});
}
NSLog(@"主线程");
网友评论