GCD多线程同步-信号量

信号量可以理解为一个特殊的变量,程序对它的访问就是原子性的,我们通过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才能通过.

你可能感兴趣的:(GCD多线程同步-信号量)