信号量可以理解为一个特殊的变量,程序对它的访问就是原子性的,我们通过PV操作来修改信号量。
PV操作:P表示通过的意思,V表示释放的意思。
荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。
这是在计算机术语中不是用英语表达的极少数的例子之一。
- (void)semaphoreSync
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t semaphoreQueue = dispatch_queue_create("semaphoreQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(semaphoreQueue, ^{
NSLog(@"模拟发送网络请求");
sleep(5);
dispatch_semaphore_signal(sem);//+1
NSLog(@"收到网络请求");
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//-1
NSLog(@"继续执行");
});
}
2018-12-18 17:51:32.120606+0800 Test[11252:1042546] 模拟发送网络请求
2018-12-18 17:51:37.124591+0800 Test[11252:1042546] 收到网络请求
2018-12-18 17:51:37.124605+0800 Test[11252:1042547] 继续执行
信号量创建的时候, 可以给他指定一个值.dispatch_semaphore_signal(sem)
对信号进行+1
操作.dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER)
对信号进行-1
操作.当进行-1
时,如果发现信号结果会<0
,那么线程进入阻塞状态.只有当信号>=0
才能通过.
网友评论