【问题标题】:How to stop a thread in iOS7 (created by dispatch_queue_create)如何在 iOS7 中停止线程(由 dispatch_queue_create 创建)
【发布时间】:2014-05-28 13:52:38
【问题描述】:

我在我的 iOS 应用程序中创建了这个线程,我想停止它:

dispatch_queue_t myDispatch = dispatch_queue_create("com.myqueue", DISPATCH_QUEUE_CONCURRENT);

其中的myDispatch 线程分别调用dispatch_global_queue 和dispatch_main_queue 来执行繁重的操作和执行图形操作。 但是为了响应应用程序中的用户操作,可以调用另一个函数,该函数使用与 myDispatch 非常相似的另一个队列。如果 myDispatch 线程终止,则没有问题,但是在 myDispatch 线程执行期间也可能发生此调用,因此我的应用程序崩溃,因为两个线程使用相同的数组。 有办法在线程终止之前停止或终止线程吗?我想杀死当前正在运行的线程并启动新线程。

【问题讨论】:

  • stackoverflow.com/questions/5449469/…。它涵盖了更广泛的内容。
  • 虽然您可以为 GCD 编写自己的取消代码,但我们大多数人会倾向于使用 NSOperationQueue 和可取消的 NSOperation 子类。请参阅并发编程指南的操作队列一章中的Responding to Cancellation Events
  • 不过,我实际上会退后一步,询问并发队列上的可取消操作是否是正确的架构,无论如何。如果您尝试协调与可变数组的交互(其本身不是线程安全的),您通常会为此使用串行队列。这取决于您要做什么,我不确定我们是否有足够的资源来提供合适的更广泛的架构建议。

标签: ios objective-c multithreading queue grand-central-dispatch


【解决方案1】:

如果你想取消/停止后台工作,你应该使用NSOperation,因为据我所知,一旦你使用GCD 发送一个块,你就会失去对它的控制。

【讨论】:

  • 它是一样的——在这两种情况下,函数都没有停止,但你必须自己检查 isCancelled 。 NSOperation 只是提供了便利——你可以很容易地用一个块来做到这一点。 -- 无论如何,这是好的建议,因为您应该在这里使用 NSOperation 便利
【解决方案2】:

要取消 GCD 线程,您必须使用自己的原子标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多