2 dongdongcoder dongdongcoder 于 2016.03.24 15:03 提问

dispatch_sync block中的线程问题

图片说明

dispatch_queue_t myQueue = dispatch_queue_create("com.team", NULL);

NSLog(@"task1 == %@",[NSThread currentThread]);
dispatch_sync(myQueue, ^{
  // task2 为什么在主线程执行,不是应该在block追加到的线程执行吗,就像task4一样,block里的线程应该和 dispatch_sync 的第一个参数的线程相同
    NSLog(@"task2 == %@",[NSThread currentThread]);

});

dispatch_async(myQueue, ^{
    NSLog(@"task3 == %@",[NSThread currentThread]);

    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"task4 == %@",[NSThread currentThread]);

    });
});

    ![图片说明](https://img-ask.csdn.net/upload/201603/24/1458802918_681208.png)

1个回答

oyljerry
oyljerry   Ds   Rxr 2016.03.24 20:43

编译器会有优化,他发现sync方式,就可能直接同一个线程执行

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
GCD:dispatch_sync会在当前线程中执行派发到其他队列的任务
dispatch_sync的官方文档中有这么一句话: As an optimization, this function invokes the block on the current thread when possible. 意思是作为优化手段,如果可以,block会直接在当前线程中执行。 然后写了几段代码测试了下:     dispatch_async(_myQueue1, ^
GCD:嵌套dispatch_async时__block对象的一个内存陷阱
啥也不说,先上代码:     dispatch_async(whatever_queue, ^{         NSNumber* number = nil;         number = @123;         dispatch_async(main_queue, ^{             NSLog(@"%@", number);         })
dispatch_sync添加到主线程关联的串行队列卡死问题理解
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); NSLog(@"3"); // Do any additional setup after loading
有意思 SDWebImage 有两个宏 来判断程序在主线程运行
#define dispatch_main_sync_safe(block)\     if ([NSThread isMainThread]) {\         block();\     } else {\         dispatch_sync(dispatch_get_main_queue(), block);\     } #define dispatch_m
dispatch_async 和 dispatch_sync 的区别
dispatch_sync(),同步添加操作。他是等待添加进队列里面的操作完成之后再继续执行。 dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_syn
iOS 多线程初学习之dispatch_async(dispatch_get_main_queue(), ^{})
IOS 多线程之 dispatch_async(dispatch_get_main_queue()})
[死锁] dispatch_sync 之于 当前线程
1: dispatch_sync 是指在指定 线程队列queue 同步执行任务block,dispatch_sync具有等待block执行结束再能回调的特点; void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); 因此,使用dispatch_sync的时候,需要注意啦,不要在当前线程队列,执行block
完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f
为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。没有一个完整的可参考系列 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己,也方便别人,如果发现有问题,欢迎提出
iOS多线程的初步研究(八)-- dispatch队列
GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用。所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致。   dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_q
dispatch_sync 的一个面试题
问题是运行以上代码会发生什么 ? 线程锁死。 解析:dispatch_sync函数是同步执行,dispatch_sync函数首先会阻塞当前线程(它运行所在的线程,这里是main_queue),等待block执行。而dispatch_sync的函数参数queue也是当前queue,即dispatch_sync函数的block需要在该参数queue中执行,然而这个被阻塞的que