当前位置: 首页 > 知识库问答 >
问题:

分派到并发队列会导致在主线程上执行?

厍彭薄
2023-03-14

苹果的GCD留档声明如下:

GCD 提供并管理 FIFO 队列,您的应用程序可以以块对象的形式向其提交任务。提交到调度队列的块在完全由系统管理的线程池上执行。不保证执行任务的线程。GCD 提供三种类型的队列:

这是否意味着即使我发出请求

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{...});

这可能会导致代码块在主线程上执行?在这种情况下,在主线程上使用并发队列调用dispatch_sync似乎会导致主线程卡住等待自己的死锁情况。

我对GCD文件的解释是否正确?

共有2个答案

马银龙
2023-03-14

由于dispatch_sync等待块完成,所以块是在并发线程上执行还是在主线程上执行实际上没有太大区别;主线程仍然被阻塞。

因此,从主线程调用dispatch_sync会有效地阻塞主线程,直到块完成,因此,除非块只执行很短时间,否则这是一个坏主意。

郭德惠
2023-03-14

是的,如果调用者在主线程上,那么dispatch_sync到全局队列可能意味着在主线程中执行代码。dispatch_sync的文档解释了:

作为优化,此函数尽可能调用当前线程上的块。

dispatch_sync总是在主线程上调度块

 类似资料:
  • 本文向大家介绍iOS 在主线程上执行,包括了iOS 在主线程上执行的使用技巧和注意事项,需要的朋友参考一下 示例 当异步执行任务时,通常需要确保在主线程上运行一段代码。例如,您可能要异步访问REST API,但将结果放在屏幕上的UILabel中。在更新UILabel之前,必须确保您的代码在主线程上运行: 每当您更新屏幕上的视图时,请始终确保您正在主线程上执行此操作,否则可能会发生未定义的行为。

  • 在调试应用程序时,我希望主线程在我放入JavaFX事件队列的每个Runnable之后等待 等待它被执行(即可见)。然而,这里有两个问题: 首先,它并不是一个标准的、GUI驱动的JavaFX应用程序。它更像是一个脚本,显示和更新一个JavaFX阶段。所以结构看起来像这样: 其次,禁用此“功能”应该很容易,即等待Runnable执行(使用当前方法没有问题,但使用替代方法也应该可行)。 做这件事的最好方

  • 问题内容: 我在寻找android文档中的postDelayed 发布延迟文档 基本上,这就是文档对该方法的说法-“导致将Runnable添加到消息队列中,并在经过指定的时间后运行。该Runnable将在用户界面线程上运行。” 我知道每个线程都有一个与之关联的消息队列,循环程序和处理程序。- 什么是Android的尺蠖,处理程序和的MessageQueue之间的关系?。就“在指定的时间段后运行”而

  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:

  • 我在C中实现了一个简单的队列,但是当我试图在退出队列后访问Q. ex时,它会出现分段错误(例如,请参阅int main())。 更准确地说,问题发生在我- 将单个元素排队 把它排出来 使一个或多个元素排队 尝试访问Q.front 然而,程序没有给出分段错误或任何错误,当我- 使多个元素排队 这是我的完整程序-

  • 队列并发两个不同的锁:一个用于 enqueue() 以保护同时排队的多个线程 如果队列已满,Add(enqueue)将跳过(返回)插入。如果队列为空,则删除(出列)将跳过删除。 我使用doRandon()生成了一堆0到1之间的随机数。我使用这些数字来决定是否添加/删除。 性能:我已尝试使用静态/动态线程分配测试队列。的执行时间

  • 本文向大家介绍iOS 在自定义线程上分派完成块,包括了iOS 在自定义线程上分派完成块的使用技巧和注意事项,需要的朋友参考一下 示例 无论何时使用AFNetworking,都会在AFNetworking提供的自定义线程上调度呼叫。当调用返回到完成块时,它将在主线程上执行。 本示例设置一个自定义线程,该线程分派到完成块: AFNetworking 2.xx: AFNetworking 3.xx:  

  • 我需要一个库或我们的软件工具,可以: 1)将线程/作业/任务(任何东西--如果需要,我们可以重写代码,我们在mintue有线程对象)放入像system这样的队列中2)我们可以定义同时最多运行多少线程3)线程完成后,线程从队列中移除,这样GC就可以移除所有涉及的实体。 我正在进行大量阅读,发现ExecutorService(Executors.newFixedThreadPool(5);)但问题可能