暂停和恢复Grand Central Dispatch线程

时间:2014-03-26 05:15:09

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

我正在使用Grand Central Dispatch在后台运行流程。我想知道如何暂停,恢复和停止该后台线程。我试过了

dispatch_suspend(background_thread);
dispatch_resume(background_thread);

但这些功能对我没有帮助,它一直在运行。请有人帮助我。

2 个答案:

答案 0 :(得分:3)

你似乎有些困惑。直接操作线程不是GCD API的一部分。您通常操作的GCD对象是队列,而不是线程。你把块放在队列中,GCD在它想要的任何线程上运行这些块。 1

此外,the dispatch_suspend man page说明了这一点:

  

调度框架总是在执行块之前检查暂停状态,但这样的更改在执行期间不会影响块(非抢先)。

换句话说,GCD不会在队列运行块时挂起队列。它只会在队列位于块之间时挂起队列。

我不知道有任何公共API允许您在没有与该线程上运行的函数合作的情况下停止线程(例如,通过设置在该线程上定期检查的标志)。

如果可能的话,你应该打破长时间运行的计算,这样你就可以在一系列的块中逐步进行计算。然后,您可以挂起运行这些块的队列。


脚注1.主队列除外。如果在主队列上放置一个块,GCD将只在主线程上运行该块。

答案 1 :(得分:0)

您正在描述并发处理模型,其中可以暂停和恢复不同的进程。这通常是使用线程实现的,或者在某些情况下使用协同程序来实现。

GCD使用不同的模型,其中一个是部分排序的块,其中每个块按顺序执行,而不直接支持抢占,暂停或恢复。

GCD信号量确实存在,并且可能适合您的需求,但是与它们创建一般的协作并发线程并不是GCD的目标。否则,使用NSThread甚至Posix线程查看基于线程的解决方案。

看看Apple的Migrating Away from Threads,看看你的模型是否适合迁移到GCD,但并非所有型号都适合。