程序员

GCD实战之多个网络请求的并发

2018-05-17  本文已影响40人  小希嘻

信号量就是一个资源计数器,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。其实,这有点类似锁机制了,只不过信号量都是系统帮助我们处理了,我们只需要在执行线程之前,设定一个信号量值,并且在使用时,加上信号量处理方法就行了。

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_wait 传入时间。如果在等待时间内没有 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);
        
      // 要执行的后续操作
    });
    
上一篇 下一篇

猜你喜欢

热点阅读