ios - 串行队列(主线程除外)代码是否在主线程上执行?

标签 ios objective-c multithreading

1)ios中创建的串行队列

_queue =dispatch_queue_create("serial-queue-1", nil);

在主线程或其他线程上运行。

还有

2)如果它在主线程上运行,那么如果我们通过以下方式同步将代码块分派(dispatch)到上面的队列

dispatch_sync(_queue, ^{ 方法1(); 方法2(); });

当轮到这个队列时,它会执行完整的代码块吗?还是可以离开这个队列去执行其他队列?

最佳答案

通常,在队列上分派(dispatch)的 block 可以在任何可用线程上运行,包括主线程。异常(exception)是在主队列上分派(dispatch)的 block 将始终在主线程上运行。

当您在串行队列上使用dispatch_sync时,它会阻塞当前队列,但不会阻塞当前线程

来自dispatch_sync documentation

Calling this function and targeting the current queue results in deadlock.

如果您使用dispatch_sync定位当前队列,您将遇到死锁,但如果您定位不同的队列,则不会出现死锁,即使分派(dispatch) block 最终位于同一线程上。

事实上:

As a performance optimization, this function executes blocks on the current thread whenever possible

因此,假设您问题中的dispatch_sync是从主队列调用的,则该 block 将在主线程上运行,因为您已经阻塞了主队列,因此主线程可用于执行工作。

iOS 多任务处理不是抢占式的,因此您的 block 不能“丢失”线程;该 block 将在放弃线程之前完整执行。这是假设 method1method2 本身不会调度更多 block 。

关于ios - 串行队列(主线程除外)代码是否在主线程上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56560364/

相关文章:

ios - 在其他屏幕中更新绑定(bind)后,SwiftUI 列表行未刷新

ios - UITableView:scrollToRowAtIndexPath或setContentOffset动画速度

python - python cgi脚本中的线程错误

ios - 使用 UILongPressGestureRecognizer 选择时在 UITableviewCell 周围绘制边框

ios - UITableView didSelectRowAtIndexPath 未被调用

objective-c - 如何将选项卡 View 项连接到操作? (OS X 上的 cocoa )

ios - enumerateObjects 阻止主 UI?

php - 如何让 php 脚本等待用户输入

ios - UITabBar 在 iOS7 上更改一个 UITabBarItem 的背景颜色

ios - AFNetworking 2.0 和背景图片