信号量
对于多个线程访问同个资源,GCD还提供是一种解决方法,就是信号量dispatch_semaphore
dispatch_queue_t asynQueue = dispatch_queue_create("asyn", DISPATCH_QUEUE_CONCURRENT); dispatch_semaphore_t semaphore = dispatch_semaphore_create(2); for (int i = 0; i < 20; i++) { dispatch_async(asynQueue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"semaphore %@------ %i", semaphore, i); sleep(2); dispatch_semaphore_signal(semaphore); }); }
dispatch_semaphore_create(2)创建了一个总量为2的信号量;
dispatch_semaphore_wait是等待信号,并让信号量-1,如果获取到的信号量是0,那么根据设置的超时时间进行等待,例子里设置的超时时间是一直;
dispatch_semaphore_signal是发送信号,并让信号量+1;
这套信号机制是不是很类似引用计数。所以,上面的这段代码并发了20个任务,每个任务都会有sleep,但每执行2个任务,经由dispatch_semaphore_wait减了两次,就为0,其他的任务只能等sleep后dispatch_semaphore_signal加回信号量才能执行,如此反复。
时间: 2024-10-27 12:03:06