`
zhangziyangup
  • 浏览: 1187377 次
文章分类
社区版块
存档分类
最新评论

Sleep和WaitForSingleObject区别

 
阅读更多

一、Msdn种Sleep解读

This function suspends the execution of thecurrent thread for a specified interval.

终止线程指定的时间间隔。

void Sleep(

DWORD dwMilliseconds);

Parameters

dwMilliseconds

Specifies the time, in milliseconds, forwhich to suspend execution. A value of zero causes the thread to relinquish theremainder of its time slice to any other thread of equal priority that is readyto run. If there are no other threads of equal priority ready to run, thefunction returns immediately, and the thread continues execution. A value ofINFINITE causes an infinite delay.

Suspend执行指定的毫秒,0导致线程放弃它的剩余时间片转向执行其他同等优先级准备执行的线程。如果没有同等优先级的其他线程在运行,函数立即返回,并且当前线程继续执行。INFINIT导致其无限延时。

VOID Sleep(DWORDdwMilliseconds); 该函数可使线程暂停自己的运行,直到dwMilliseconds过去为止。

关于Sleep函数,有下面几个重要问题值得注意:

* 调用Sleep,可使线程自愿放弃它剩余的时间片。

* 系统将在大约的指定毫秒数内使线程不可调度

* 你可以调用Sleep,并且为dwMilliseconds参数传递INFINITE。这将告诉系统永远不要调度该线程。这不是一件值得去做的事情。最好是让线程退出,并还原它的堆栈和内核对象。

* 你可以将0传递给Sleep。这将告诉系统,调用线程将释放剩余的时间片,并迫使系统调度另一个线程。但是,系统可以对刚刚调用Sleep的线程重新调度。如果不存在多个拥有相同优先级的可调度线程,就会出现这种情况。

二、Sleep和WaitForSingleObject区别

Sleep的话,只是睡一段时间,时间一到,就变成可调度状态。而WaitForSingleObject则是等待某个内核对象变成有信号状态,其目的和意义很明显,因此更具有针对性。我个人的习惯,在主线程中不用WaitForSingleObject,因为它容易引起死锁

WaitForSingleObject

Sleep

等待信号返回,

等待一定的时间

灵活;等待信号的时间内,信号也可能提前返回

需要强制等待固定的时间

总结:如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。[尚未遇到此类情况].

但[MSDN]上有详细介绍:

Ifa thread creates any windows, it must process messages. Message broadcasts aresent to all windows in the system. A thread that uses a wait function with notime-out interval may cause the system to become deadlocked. Two examples ofcode that indirectly creates windows are DDE and COM CoInitialize.Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjectsor MsgWaitForMultipleObjectsEx,rather than WaitForSingleObject.

如果线程创建了窗口,他必须处理消息。消息广播发送至系统中的所有窗口。一个使用没有时延间隔的等待函数可能导致系统死锁。在DDE和COM初始化的时候间接地创建了窗口。因此,如果通过线程创建了窗口,应该使用MsgWaitForMultipleObjectsor MsgWaitForMultipleObjectsEx,而不是WaitForSingleObject.。

借鉴了论坛里的一些回复,谢谢!

分享到:
评论

相关推荐

    线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    ### 线程中CreateEvent和SetEvent及WaitForSingleObject的用法 #### CreateEvent函数详解 **CreateEvent** 函数主要用于创建或打开一个命名的或无名的事件对象。事件对象通常用于同步线程之间的操作,例如,用于...

    桌面\关于WaitForSingleObject实例分析

    - 使用`Sleep(1000)`使得线程每秒更新一次时间。 2. **`ThreadFunc2`函数**: - 首先调用`WaitForSingleObject(event, INFINITE)`等待`event`变为有信号状态。如果`event`当前为无信号状态,则该线程将阻塞等待,...

    操作系统读者写者问题

    在实现读者优先和写者优先的读者-写者问题时,需要使用Windows API中的CreateThread、ExitThread、Sleep、WaitForSingleObject和CreateSemaphore等函数。CreateThread函数用于创建线程,ExitThread函数用于结束当前...

    《精通Windows API函数、接口、编程实例》源代码(第4、5、6、7章)

    线程创建、同步和调度的API,如CreateThread、Sleep、WaitForSingleObject等,都是这一章的重点。同时,模块管理涉及动态链接库(DLL)的加载、卸载及函数调用,如LoadLibrary、GetProcAddress和FreeLibrary等。理解...

    种类齐全的调试与反调试,来自GitHub

    - WaitForSingleObject -> WaitForSingleObjectEx -> NtWaitForSingleObject - WaitForMultipleObjects -> WaitForMultipleObjectsEx -> NtWaitForMultipleObjects (todo) - IcmpSendEcho (CCleaner Malware) - ...

    新编Windows API参考大全

    3. **线程操作**:如CreateThread、Sleep、WaitForSingleObject等,用于多线程编程。 4. **内存管理**:包括VirtualAlloc、VirtualFree等函数,用于动态分配和释放内存。 5. **文件操作**:如CreateFile、ReadFile...

    VC 中posemessage与sendmessage的区别

    如果线程尚未创建消息队列,可以通过调用Sleep或WaitForSingleObject等方法来等待线程准备就绪。 消息处理是Windows编程的基础,理解PostMessage和SendMessage之间的区别以及如何正确使用它们对于编写高效的VC++...

    WINDOWS下延时控制

    总结来说,Windows下的延时控制主要依赖于API函数,而硬件实现的延时控制系统则利用CPLD和单片机的精确时序逻辑,两者在精度和应用场景上有显著区别。在软件开发中,选择合适的延时控制方法取决于具体需求,如响应...

    最新的MFC类库详解和新编win32api

    5. 多线程编程:CreateThread、Sleep、WaitForSingleObject等API,帮助开发者实现并发执行的程序。 6. GDI(Graphics Device Interface):包括绘制图形、文字、位图等图形操作的API,如CreatePen、SelectObject、...

    c++实现生产者消费者问题

    Sleep(1000); // 模拟生产时间 // 获得互斥量 WaitForSingleObject(hMutex, INFINITE); // 添加数据到缓冲区 buffer.push_back(i); // 释放互斥量 ReleaseMutex(hMutex); } return 0; } // 消费者线程...

    操作系统实验教案打印版一.pdf

    Windows API(Application Programming Interface,应用程序编程接口)是Windows操作系统提供的一系列函数和协议,允许程序员使用C/C++等语言开发Windows应用程序。在文档中,提及了CreateThread()、ExitThread()、...

    windows多线程的同步和互斥

    5. **线程同步API(如:Sleep, SleepEx, QueueUserAPC等)**:这些API可以用来控制线程的执行顺序,或者让线程暂停一段时间,以避免过度竞争资源。 二、线程互斥 线程互斥是线程同步的一个子集,主要关注的是确保...

    实验报告1

    4. **Sleep**:在`program1`和`program2`中,`Sleep`函数被用来使进程暂停指定的毫秒数。在`program1`中,它简单地延迟了500毫秒,而在`program2`中,根据命令行参数决定睡眠时间,展示了如何接收和处理输入参数。 ...

    1500个WINDOWS API类全集

    Windows API(应用程序接口)是微软操作系统提供的一组函数和过程,允许程序员访问操作系统的核心功能和服务。这个1500个Windows API类全集是一个宝贵的资源,涵盖了广泛的操作系统交互功能,包括窗口管理、输入输出...

    多线程实例代码

    多线程编程允许程序同时执行多个任务,从而提高系统的并发性和响应性。在Windows操作系统中,可以通过`CreateThread`函数来创建新线程。每个线程都有自己的执行路径,并且可以共享同一进程中的资源,如内存空间等。 ...

    怎样干净的关闭指定线程

    然而,在实际应用中,我们经常会遇到需要干净地关闭指定线程的需求,尤其是在进行系统资源管理和错误处理时。本文将详细介绍一种通过向指定线程插入异常的方式来实现线程干净关闭的方法。 #### 一、向指定线程插入...

    操作系统实验:多线程并发程序设计模拟生产者消费问题

    `CreateThread`函数用于创建线程,`Sleep`函数让线程休眠指定的时间,`WaitForSingleObject`函数则是用来等待信号量状态的改变。在生产者线程中,`ProducerThread`函数先根据传入的参数获取线程的延迟和持续时间,...

    操作系统-4.3-Windows线程编程1

    3. **WaitForSingleObject()** 和 **WaitForMultipleObjects()**: 这两个函数用于等待线程或事件对象。它们可以用来同步线程,确保线程按预期顺序执行或等待特定线程完成。 4. **CloseHandle()**: 释放由...

Global site tag (gtag.js) - Google Analytics