gcd 重点

DCD

`c++

#pragma 信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

    // 相当于加锁
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"执行任务1");
    // 相当于解锁
    dispatch_semaphore_signal(semaphore);
});

dispatch_async(queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"执行任务2");
    dispatch_semaphore_signal(semaphore);
});

dispatch_async(queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"执行任务3");

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        [NSThread sleepForTimeInterval:3];
        NSLog(@"异步执行任务3");
        dispatch_semaphore_signal(semaphore);
    });

});

dispatch_async(queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"执行任务4");
    dispatch_semaphore_signal(semaphore);
});

#pragma barrier
dispatch_queue_t queue2 = dispatch_queue_create("zzn.com.01", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue2, ^{
    // doSomething()
    [NSThread sleepForTimeInterval:2];
    NSLog(@"barrier:执行任务1");
});
dispatch_barrier_async(queue2, ^{
    NSLog(@"barrier:执行任务2");
});

#pragma group
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue3 = dispatch_queue_create("zzn.com.03", DISPATCH_QUEUE_CONCURRENT);

//
dispatch_group_async(group, queue3, ^{

    [NSThread sleepForTimeInterval:2];
    NSLog(@"group:执行任务1");
});

// 等同 dispatch_group_async
dispatch_async(queue3, ^{

    dispatch_group_enter(group);
    [NSThread sleepForTimeInterval:2];
    dispatch_group_leave(group);
    NSLog(@"group:执行任务2");
});

dispatch_group_notify(group, queue3, ^{
    NSLog(@"group:执行任务3");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);