GCD(三)

说说线程同步。

先引入一个例子:如果想让队列中所有的任务执行完成后再执行某个任务,怎么办呢?在串行队列中,可以把该操作放到最后一个任务之后,但是在并行队列中呢?可以用队列组(group)操作。

1.group notify

dispatch_queue_t queue = dispatch_queue_create("com.xxx.xxx", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^(){
    NSLog(@"block1---%@",[NSThread currentThread]);
});

dispatch_group_async(group, queue, ^(){
    NSLog(@"block2---%@",[NSThread currentThread]);
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^(){
    NSLog(@"某个任务---%@",[NSThread currentThread]);
});

2.group enter 与 group leave

dispatch_group_t group =dispatch_group_create();
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_enter(group);

//模拟多线程耗时操作
dispatch_group_async(group, queue, ^{
    sleep(3);
    NSLog(@"block1---%@",[NSThread currentThread]);
    dispatch_group_leave(group);
});

NSLog(@"1---%@",[NSThread currentThread]);

dispatch_group_enter(group);

//模拟多线程耗时操作
dispatch_group_async(group, queue, ^{
    sleep(3);
    NSLog(@"block2---%@",[NSThread currentThread]);
    dispatch_group_leave(group);
});

NSLog(@"2---%@",[NSThread currentThread]);

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"最后的任务---%@",[NSThread currentThread]);
});

可以看到,上面两个例子的输出结果一致,都是最后的任务最后执行,前面的任务并发执行,执行顺序不定。

这和线程同步有啥关系呢?其实这就是线程同步的一种场景。

当然,还有其他处理线程同步的方式:加锁。

http://www.cocoachina.com/ios/20180323/22736.html
https://blog.csdn.net/cordova/article/details/72848330