【发布时间】:2021-10-02 20:32:39
【问题描述】:
我正在目标 C 中创建一个应用程序,其中有两个线程:
- 主线程,从睡眠中唤醒并被其上的模块异步调用
- 回调块(线程)的执行是异步的,并且依赖于发送通知的外部模块“M”。
在我的主线程上,我想在开始执行任务之前等待回调进来。所以,我尝试在主线程上使用dispatch_group_enter 和dispatch_group_wait(FOREVER),同时在回调线程上调用dispatch_group_leave。这确保了当主线程第一个执行时,事情会按预期发生,即主线程等待回调进入并在执行其任务之前解除阻塞。
但是,我看到了一种竞争情况,回调块有时会首先被调用并停留在dispatch_group_leave(因为此时主线程尚未调用dispatch_group_enter。
我可以为此目的使用不同的 GCD 构造吗?
【问题讨论】:
-
为什么这么复杂?在 GCD 中,您通常不会考虑线程。它们被抽象在队列下面。您通常会为您的“主线程”创建一个队列(这不是一个很好用的术语,因为“主线程”在 iOS 中具有特定含义,所以我将其称为 WorkQueue。当然,如果您在谈论阻塞主线程,那么这是一个非常糟糕的主意)。当回调代码被执行时,它可以简单地将所需的任务分派到 WorkQueue 上。 GCD 会找到一个合适的线程来执行工作。这个任务没有理由“睡觉”;它要么正在执行,要么没有。
标签: ios multithreading grand-central-dispatch