信号量就是一个资源计数器,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。其实,这有点类似锁机制了,只不过信号量都是系统帮助我们处理了,我们只需要在执行线程之前,设定一个信号量值,并且在使用时,加上信号量处理方法就行了。
GCD 的信号量
/创建信号量
dispatch_semaphore_create(信号值)
//发送信号量
dispatch_semaphore_signal(信号量)
//等待信号量
dispatch_semaphore_wait(信号量,等待时间)DISPATCH_TIME_FOREVER
- 执行
dispatch_semaphore_create
会根据传入的long型参数创建对应数目的信号量;执行dispatch_semaphore_signal
会增加一个信号量;执行dispatch_semaphore_wait
则会 -1 信号量,如果信号量是0,就会根据传入的等待时间来等待。- GCD中的信号量
dispatch_semaphore
进行实现,即营造线程同步情况。
dispatch_semaphore
信号量为基于计数器的一种线程同步机制。用于解决在多个线程中访问共有资源,因为多线程特性而引发的数据出错问题。
如果 semaphore 大于等于1,计数-1,返回,程序继续执行。如果计数为0,则等待,等待时间为dispatch_semaphore_wai
t 传入时间。如果在等待时间内没有dispatch_semaphore_signal
信号量 +1 ,则时间到了会继续往下执行。
dispatch_semaphore_signal(semaphore)
为计数+1操作。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
为设置等待时间,这里设置的等待时间是一直等待。
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[self tenderRequest:^ {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_async(group, queue, ^{
[self tenderRequest:^ {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_notify(group, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 要执行的后续操作
});