首先有一个问题:
假设现在只有两条空闲资源可以利用,但是同一时间有三个线程需要进行访问,这种情况该如何处理呢?
1.什么是信号量dispatch_semaphore?
信号量就是一种可以用来进行控制访问资源的数量的标识,设定了一个信号量,
在线程访问之前,加上信号量的处理则可告知系统按我们制定的信号数量来执行
多个线程。
2.信号量主要有3个函数:
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_create(信号量值)
//等待降低信号量
dispatch_semaphore_wait(信号量,等待时间)
//提高信号量
dispatch_semaphore_signal(信号量)
正常的使用顺序是先降低然后再提高,这两个函数通常成对使用
3.使用:
-(void)dispatchSignal {
dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//任务1
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 1");
sleep(1);
NSLog(@"complete task 1");
dispatch_semaphore_signal(semaphore);
});
//任务2
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 2");
sleep(1);
NSLog(@"complete task 2");NSLog(@"complete task 3");
dispatch_semaphore_signal(semaphore);
});
//任务3
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 3");
sleep(1);
NSLog(@"complete task 3");
dispatch_semaphore_signal(semaphore);
});
}
结果是:NSLog(@"run task 1");
NSLog(@"run task 2");
NSLog(@"complete task 2");
NSLog(@"complete task 1");
NSLog(@"run task 3");
NSLog(@"complete task 3");
总结:由于设定的信号值为2,先执行两个线程,等执行完一个,才会继续执行下一个,保证同一时间执行的线程数不超过2。
假设信号量是1的话则结果就会为:NSLog(@"run task 1");
NSLog(@"complete task 1");
NSLog(@"run task 2");
NSLog(@"complete task 2");
NSLog(@"run task 3");
NSLog(@"complete task 3");
网友评论