iOS开发学习文档

GCD信号量-Dispatch Semaphore

2020-05-05  本文已影响0人  九色鹿的女孩
1.GCD信号量-Dispatch Semaphore

Dispatch Semaphore是持有计数的信号,当计数为0的时候线程等待,计数为1或者大于1时,减去1而不等待。
GCD信号量主要相关的三个函数:

dispatch_semaphore_t lock = dispatch_semaphore_create(long value); //创建一个信号量
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);  //信号量为0时一直等待,直到Dispatch Semaphored 的计数值大于等于1,调用这个函数会将计数值减1
dispatch_semaphore_signal(lock);//发送一个信号量,将Dispatch Semaphored 的计数值加1

举个栗子:
下面的数组如果不添加线程锁,多个线程同时更新这个数组,执行过程中会因为内存错误导致奔溃。我们可以在操作数组前,调用dispatch_semaphore_create,将信号量计数设置为1,再调用dispatch_semaphore_wait方法,将信号量计数减1,这个时候信号量计数为0,其他线程等待,只有当前线程可以安全进行操作,直到addObject方法调用完后,再执行dispatch_semaphore_signal方法,将信号量计数加1,排他控制结束,其他线程可以进行更新。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 生成Dispatch Semaphore 计数值设定为1
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
for (int i=0; i < 10000; i++) {
    dispatch_async(queue, ^{
       // 将计数减1,这个时候计数值变成了0,线程等待,因此可以进行安全的更新,直到计数值达到大于等于1,其他线程才可以更新
        long result = dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        if (result == 0) {
            NSLog(@"result为0");
        } else {
            NSLog(@"result:%ld", result);
        }
        [self.array addObject:@(i)];
       // 发送信号量,将Dispatch Semaphore计数值加1
        dispatch_semaphore_signal(semaphore);
    });
}
上一篇下一篇

猜你喜欢

热点阅读