gpt4 book ai didi

objective-c - dispatch_sync() 总是在主线程中执行 block

转载 作者:太空狗 更新时间:2023-10-30 03:35:19 26 4
gpt4 key购买 nike

在 3 个不同的队列中调用 dispatch_sync 有什么区别吗

1.

 dispatch_sync(dispatch_get_main_queue(),^(void){
NSLog(@"this execute in main thread") // via [NSThread isMainThread]

});

2.

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
NSLog(@"this also execute in main thread") // via [NSThread isMainThread]
}

3.

dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_sync(queue, ^(void){
NSLog(@"this also execute in main thread") // via [NSThread isMainThread]
}

每当我调用 dispatch_sync 时,都会在主线程中执行 block ,而不考虑它是在哪个队列中调度的。那么为什么这个函数将队列作为参数,因为它不使用它。有人可以澄清一下吗?

最佳答案

dispatch_sync是一个阻塞操作。也就是说,在 block 中表示的工作完成之前,该函数不会返回。

当分派(dispatch)到一个异步队列时——比如全局队列之一或您自己创建的并发队列——除了在调用的线程上调用 block 之外没有理由做任何事情dispatch_sync() .即使在调用同步队列上的 block 的情况下,dispatch_sync()无论如何都会等到完成,所以在内部,它可能会停止,直到队列中的其余工作完成,然后直接执行 block 。

事实证明,将数据从线程 A 传递到线程 B 的代价很高。如果队列处于可以立即执行的状态,则 dispatch_sync将通过简单地调用 dispatch_sync 的线程上的 block 来快速执行路径被召唤。

而且,根据定义,您不应该关心。调用线程被阻塞——什么也做不了——直到 dispatch_sync()返回。

所以,实际上,所有这些都是实现细节。 GCD 可以自由地在它认为最合适的任何线程上执行 block 。碰巧的是,不要上下文切换通常是解决这个问题的最重要规则。

关于objective-c - dispatch_sync() 总是在主线程中执行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26020656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com