GCD之线程挂起与恢复

我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue。调用dispatch_suspend会增加queue的引用计数,调用dispatch_resume则减少queue的引用计数。当引用计数大于0时,queue就保持挂起状态。因此你必须对应地调用suspend和resume函数。挂起和继续是异步的,而且只在执行block之间(比如在执行一个新的block之前或之后)生效。挂起一个queue不会导致正在执行的block停止。

下面看代码:


dispatch_queue_t queue=dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

   dispatch_suspend(queue);

   dispatch_async(queue, ^{

       dispatch_apply(5, queue, ^(size_t index) {

           NSLog(@"%ld  1",index);

       });

   });

   sleep(1);

   NSLog(@"aa");

   dispatch_resume(queue);

 运行结果:

如果把线程挂起恢复取消之后:

 dispatch_queue_t queue=dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

//    dispatch_suspend(queue);

    dispatch_async(queue, ^{

        dispatch_apply(5, queue, ^(size_t index) {

            NSLog(@"%ld  1",index);

        });

    });

    NSLog(@"aa");

//    dispatch_resume(queue);

 运行结果如下 :

可以看到:线程挂起时,添加到线程队列中的block并没执行,而且还将主线程休眠了1秒,取消线程挂起后才执行,而在第二个代码段中,没有使用线程挂起,可以看到并不会都是aa先输出。

时间: 2024-09-03 09:05:48

GCD之线程挂起与恢复的相关文章

详解Java编程中线程的挂起、恢复和终止的方法_java

有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线程机制在Java 2和早期版本中有所不同.尽管你运用Java 2的途径编写代码,你仍需了解这些操作在早期Java环境下是如何完成的.例如,你也许需要更新或维护老的代码.你也需要了解为什么Java 2会有这样的变化.因为这些原因,下面内容描述了执行线程控制的原始方法,接着是Java 2的方法. Jav

线程 死锁-一个关于线程挂起、唤醒的问题

问题描述 一个关于线程挂起.唤醒的问题 在windows平台上, 线程的挂起可以使用API SuspendThread()函数,而减少线程的挂起计数则可以使用ResumeThread()函数,但是今天却发现了其中隐藏的问题:1. 现有一个主线程和子线程A,在主线程中调用SuspengThread()使得A被挂起:2. 主线程中调用ResumeThread()使得A恢复运行:3. 主线程立刻调用SuspendThread()意图挂起A时,主线程竟然被阻塞在了调用处!也就是说产生了deadlock!

vb.net 线程挂起 怎么用?

问题描述 vb.net线程挂起怎么用?就是暂停,恢复执行的操作谁有实例啊??我用的一个说过时了,有警告信息.他吗的百度都所搜不到一个挂起的实例.服了. 解决方案 解决方案二:我也想知道解决方案三:就像sleep功能的.只是SLEEP固定时间,我的程序不是固定时间的.要某段程序执行完事,执行它~!解决方案四:suspend的完美替代品是什么??鸡巴磕了,什么破VB.net草.解决方案五:线程暂停,恢复没人知道啊?百度都不给个明确的哎解决方案六:.net不是有threading.thread.sus

C# 多线程挂起和恢复

问题描述 有两个Form,FormA和FormB,单击FormB中的某个Button弹出确认窗体(含有YSE和NO两个按钮),此时FormA立即挂起,如果单击FormB的YSE,FormA恢复执行,否则单击FormB的NO,FormA和FormB全部终止.问题:怎么跨线程让FormA挂起和恢复.thread.Suspend()和thread.Resume(),VS2008提示这两个方法都过时了(因为可能会引起死锁).这两个方法就不要考虑了.谢谢各位了. 解决方案 解决方案二:看不懂窗体立即挂起是

关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题

这两天有客户跟我说了个问题,说他们发现weblogic不停的load class,最后线程都挂在了Zip Entry操作上.让他们做了thread dump, 开始以为跟JDK的IO性能有关系,因为我曾经在HP\AIX上都碰到过线程挂起在zip操作上的问题,最终客户通过调整OS参数后,问题得到解决.但在拿到thread dump后, 发现问题不是他们说的那样,thread trace如下: "ExecuteThread: '6' for queue: 'Out.Thread Pool'"

Linux 线程挂起与唤醒功能 实例

pthread_cond_wait 多线程的条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给出条件成立信号).为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起. 创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下: pthread_cond_t cond=PTHREAD_COND

.Net 下跟踪线程挂起和程序死循环

.Net 下调试跟踪线程挂起和程序死循环 作者:Eaglet .Net 下的程序调试相对C/C++要简单很多,少了那些令人头疼的指针越界的问题.不过当你的程序遇到如下问题时,依然非常棘手: 1. 进程异常终止.解决方案见 .Net 下未捕获异常的处理 2. 内存泄漏或者内存申请后程序始终没有释放.解决方案见 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇 .如果通过自己编写的程序监控,我将在以后的文章中阐述. 3. 线程因未知原因挂起,比如死锁. 4.

线程管理(五)线程的睡眠和恢复

线程的睡眠与恢复 有时, 你会感兴趣在一段确定的时间内中断执行线程.例如, 程序的一个线程每分钟检查反应器状态.其余时间,线程什么也不做.在这段时间,线程不使用任何计算机资源.过了这段时间,当JVM选择它时,线程会准备好继续执行.为达此目的,你可以使用Thread类的 sleep() 方法 .此方法接收一个整数作为参数,表示线程暂停运行的毫秒数. 在调用sleep() 方法后,当时间结束时,当JVM安排他们CPU时间,线程会继续按指令执行, 另一种可能是使用一个有TimeUnit列举元素的sle

mfc线程挂起唤醒操作问题

问题描述 mfc线程挂起唤醒操作问题 HANDLE hThread; CWnd *pWnd; UINT TextShow(LPVOID pParam) { CString szLine; //打开文件 CStdioFile file; file.Open(_T("E:1.txt"), CFile::modeRead); //逐行读取字符串 while (file.ReadString(szLine)) { pWnd->SetWindowText(szLine); hThread