我正在使用Grand Central Dispatch在后台运行流程。我想知道如何暂停,恢复和停止该后台线程。我试过了
dispatch_suspend(background_thread);
dispatch_resume(background_thread);
但这些功能对我没有帮助,它一直在运行。请有人帮助我。
答案 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,但并非所有型号都适合。