美文网首页
GCD多线程同步-信号量

GCD多线程同步-信号量

作者: 爱吃萝卜的小蘑菇 | 来源:发表于2018-12-18 18:04 被阅读9次

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

      本文链接:https://www.haomeiwen.com/subject/mkblkqtx.html