GCD-dispatch_semaphore

相关的方法有dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);dispatch_semaphore_signal(dispatch_semaphore_t dsema);
- dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); 测试信号量
传入一个生成的信号量,和一个等待时间。信号量可以理解为某个资源可允许同时执行的操作数。比如说,我们这个信号量的值为2。那么我们就确定了,可以同时有两个操作对某个资源进行处理。
当此方法执行时,会检测信号量是否有剩余可操作数,如果有的话,就取得一个操作并且把可操作数-1,然后执行操作任务。
如果没有剩余可操作数,酒会等待。这样就保证了,某段代码只在同一时间有我们想要的操作量。
- dispatch_semaphore_signal(dispatch_semaphore_t dsema); 释放信号量
执行此方法,会释放信号量,对资源的操作已经完成了,需要把获得的操作归还给信号量。
示例:

- (IBAction)GCD_dispatch_semaphore_buttonAction:(UIButton *)sender {
    //我们现在要遍历这个数组,要求是同时只有一个线程进行遍历。
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:20];

    //创建一个信号量并设置一个初始值,表示有多少资源(这里的资源可理解为操作资源)
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

    for (int i = 0; i<20; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            //测试可使用的资源量,如果有资源,则取得一个资源并对资源量-1,执行操作,如果没有资源则等待
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

            //对需要加锁的对象进行操作
            [arr addObject:[NSNumber numberWithInt:i]];

            //释放一个资源
            dispatch_semaphore_signal(semaphore);
        });
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值