GCD dispatch_semaphore

2017-02-23  本文已影响58人  君莫叹人生如若初见

// 以打印100个数字为例
   for (int i = 0; i < 100;  i ++) {
        NSLog(@"%i", i);
    }

上述打印后会在控制台中依次输出1-100

  1. dispatch_semaphore让线程加锁
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    for (int i = 0; i < 100; i++) {
        dispatch_async(queue, ^{
            // 相当于加锁
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            NSLog(@"i = %zd semaphore = %@", i, semaphore);
             NSLog(@"%d", i);
            // 相当于解锁
            dispatch_semaphore_signal(semaphore);
        });
    }

分析:以上代码首先创建一个队列,随后异步运行队列,没有加dispatch_semaphore之前控制台打印的数据顺序不一,加上dispatch_semaphore之后,会发现顺序变一致了。因为加锁进入
dispatch_semaphore_wait的时候,信号量便会0,阻塞当前的线程,异步进入此命令的时候,无法继续执行下一步,随后到达dispatch_semaphore_signal,信号量+1,此时线程通常,如此便可以为线程加锁。

  1. 用dispatch_semaphore 每隔10秒打印顺序不一的数字。
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    for (int i = 0; i < 100; i ++) {
      dispatch_group_async(group, queue, ^{
          dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
          NSLog(@"%d",i);
          sleep(2);
          dispatch_semaphore_signal(semaphore);
      });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

分析: 信号量为10,并发进入dispatch_semaphore_wait的时候,递减到0, 随后线程堵塞,sleep(2)中阻塞当前线程直到两秒后dispatch_semaphore_signal依次递增,并返回信号量,这样就可以每隔10秒打印顺序不一的数字。
dispatch_group_wait 会一直阻塞线程,直到 dispatch_group_t完成或者超时才会执行以下的代码。

上一篇下一篇

猜你喜欢

热点阅读