OC信号量的基本使用

2019-05-24  本文已影响0人  Nonsense_biubiu

信号量

dispatch_semaphore_create(long value);


dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);


dispatch_semaphore_signal(dispatch_semaphore_t dsema);


用法

控制线程数量

 self.signal = dispatch_semaphore_create(10);
    for (int i = 0; i < 1000; i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(self.signal, DISPATCH_TIME_FOREVER); //信号量-1
            //...耗时操作
            dispatch_semaphore_signal(self.signal);// 信号量+1
        });
        
    }

等待异步回调(强行同步代码块)

    dispatch_async(self.queue, ^{
        self.signal = dispatch_semaphore_create(1); //只允许一个信号量
        int a = 0;        
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //开启一个耗时的异步Block
            //异步的耗时操作,比如:睡眠3秒
            [NSThread sleepForTimeInterval:3];
            a = 1;
            dispatch_semaphore_signal(self.signal);//释放信号量
        });
        dispatch_semaphore_wait(self.signal, DISPATCH_TIME_FOREVER); //锁住信号量
        //等待异步回调完成后的操作。
      NSLog(@"current a :%ld",(long)a);
    });

其他语言相似的地方.

注意事项:不要轻易在主线程调用wait方法。在信号量小于0的情况下绝对会锁住当前主线程。

上一篇 下一篇

猜你喜欢

热点阅读