关于semaphore(信号量)

来源:互联网 发布:淘宝美工笨的人难学吗 编辑:程序博客网 时间:2024/05/20 19:16
在GCD中,处理并发控制主要是使用一个串行队列dispatch_queue_t,先进先出的原则,保证队列的正常进行。但在某一个时刻,可能会有多个block并发执行,我们的主线程就需要不断轮去查询一知晓block是否执行完毕,但这样做的效率是很低的,浪费CPU资源,因此我们使用通信机制去解决这个问题:semaphore信号量。它的原理很简单,生产消费模式,必须生产才能消费,没有资源的时候我什么也不干,直到资源就绪。

-(void)prepare

{

   __blockint sum=0;

   

    //资源数小于0,表示资源不可得

   __block dispatch_semaphore_t_sem1=dispatch_semaphore_create(0);

   __block dispatch_semaphore_t_sem2=dispatch_semaphore_create(0);

   

   dispatch_block_t task1=^{

      int s = sum;

      for (int i = 0; i < 2; i++)

          s += 1;

          sum = s;

       

       NSLog(@" >> after task1: %d", sum);

      dispatch_semaphore_signal(_sem1);

   };

   

   dispatch_block_t task2=^{

       //等待第一个信号量

      dispatch_semaphore_wait(_sem1,DISPATCH_TIME_FOREVER);

       

      int s = sum;

      for (int i = 0; i < 3; i++)

          s += 3;

       sum =s;

       

       NSLog(@" >> after task2: %d", sum);

      dispatch_semaphore_signal(_sem2);

   };

   dispatch_async(_serialqueue, task1);

   dispatch_async(_serialqueue, task2);

   

    //等待第二个信号量,直到资源准备就绪

   dispatch_semaphore_wait(_sem2,DISPATCH_TIME_FOREVER);

   

   dispatch_release(_sem1);

   dispatch_release(_sem2);

}


0 0