2.5秒精通IOS信号量

826 阅读1分钟

1.干啥用?
信号量是多线程环境下的一种保护设施,可以用来保证两个或多个关键代码不被并发调用。

2.具体怎么保护的?
在进入一个关键代码段之前,线程必须获取一个信号量。一旦执行完毕,该线程就会释放信号量。等待下一个信号量被发送,线程才能继续获取到新信号量并再次执行关键代码段。

3.四种操作:
1.初始化信号(initialize/create) 2.发信号(signal/post) 3.等信号(wait/suspend) 4.释放信号(destroy)

4.常用的发信号量方式?
而在我们iOS开发中,想使用信号量,首先想到的就是GCD中的dispatch_semphore_t。

5.GCD具体怎么用?
创建:dispatch_semaphore_create(long value); //!< 创建信号量 发送:dispatch_semaphore_signal(dispatch_semaphore_t dsema); //!< 发送信号量 等待:dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); //!< 等待信号量

6.使用场景:
使用信号量使“异步”线程完成“同步”操作 即使是在多线程并发的场景,也可以通过控制信号量来保证操作的同步

7.信号量相比串行队列的优势?
串行队列因为是异步操作,所以会开启一个新的子线程, 同时又是串行队列,所以只会开启一条子线程进行同步操作。 丧失了多线程的优势 串行队列需要写在一个方法里去做, 而实际开发中,可能异步分布在各个方法中,但同时又想串行去执行

8.直接上代码(专供Ctrl+C___狗头.gif)

    // create
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务1:%@",[NSThread currentThread]);
        dispatch_semaphore_signal(sem);
    });   

    // wait
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务2:%@",[NSThread currentThread]);
        dispatch_semaphore_signal(sem);
    });
    
    // wait
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务3:%@",[NSThread currentThread]);
    });