多线程中sleep与WaitForSingleObject的区别?300分。大虾们多多讨论(300分)

  • 主题发起人 主题发起人 jeckeycoo
  • 开始时间 开始时间
J

jeckeycoo

Unregistered / Unconfirmed
GUEST, unregistred user!
sleep不延迟时线程不会交出所有权,而WaitForSingleObject会,因此WaitForSingleObject比较彻底,效率更高。
哪位大虾有相关资料,发来研究研究。
大虾们多多讨论
 
大虾们来讨论啊
 
SLEEP耗资源
WaitForSingleObject不耗资源
 
线程也能告诉系统,它不想在某个时间段内被调度。这是通过调用Sleep函数来实现的:
VOID Sleep(DWORD dwMilliseconds);
该函数可使线程暂停自己的运行,直到dwMilliseconds过去为止。
关于Sleep函数,有下面几个重要问题值得注意:
* 调用Sleep,可使线程自愿放弃它剩余的时间片。
* 系统将在大约的指定毫秒数内使线程不可调度。
* 你可以调用Sleep,并且为dwMilliseconds参数传递INFINITE。这将告诉系统永远不要调度该线程。这不是一件值得去做的事情。最好是让线程退出,并还原它的堆栈和内核对象。
* 你可以将0传递给Sleep。这将告诉系统,调用线程将释放剩余的时间片,并迫使系统调度另一个线程。但是,系统可以对刚刚调用Sleep的线程重新调度。如果不存在多个拥有相同优先级的可调度线程,就会出现这种情况。

等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是WaitForSingleObject 和WaitForMultipleObjects。
 
很多人都推荐使用WaitForSingleObject,偶的经验觉的,使用互斥量线程同步时WaitForSingleObject更好用,效率更高,但如果使用临界区时,sleep更好用,而且所谓的sleep不会交出所有权的说法,也没见过正式文章介绍,而我研究Indy的源码,发现也用的是sleep
 
所谓Sleep耗资源主要是指睡眠时不会交出所有权,导致的资源消耗,但这样的正式文章小弟实在是没找到
不知道大虾们是否有类似的文章,帖点出来一起研究
 
什么东西最好就是自己试一试,不要凭想像,我都是用sleep释放CPU占用,没遇到过什么问题。waitforsingleobject在vc调用线程上用过感觉内部实现应该和Sleep差不多,还是用Sleep比较方便。最重要不是技术,而是实现就是硬道理。
 
发现有些专业的工业控件,也用是用sleep.而且经测试效果不错!
推荐看一下《Windows 下多线程设计(侯捷译)》(好象是这个书名)
 
不管是sleep还是waitfor……函数,各自有各自的优点和缺点。虽然上面列了那么多使用sleep的权威的控件,但是我还是推荐使用waitfor……,因为使用sleep的时候,你关闭软件的时候,很容易出错,这是由于资源没有完整的释放导致,而导致资源没有完整释放又恰好是sleep导致的。在多线程里面,就必须考虑到资源的释放,否则问题非常的大。不管用sleep还是waitfor……,只要你能解决问题,那就是对的。
 
sleep(1)就可以释放资源。我专门写了程序测试两者的精确度,最后结果一样比如等待1毫秒最后的结果都非常相近。从这个角度来说,没有谁更精确这一说法。
 
感觉还是wait*系列函数更好一些
因为可以在完成相同功能的情况占用更少的CPU资源,实时性要好一些
比如串口通讯的握手过程
使用Wait*系列函数,可以发送完毕后设置超值为30秒,当是当有数据到达时以立即停止等待,处理数据
如果使用Sleep只能有两种方法,循环执行多个短时间的Sleep
或者Sleep(30000)
如果前一种情况因为在循环,所以会占用CPU资源
如果有后一种方法
当数据在30内到达时将会反应迟钝
 
如果调用多线程画图,而画图的工具是Tchart的,线程的等待用sleep,还是wait..?
 
我已经实现了远程开机、关机、注销、重启、通讯以及远程抓屏、收发文件。
现在就差远程桌面控制了,简单来说就是用一台电脑的键盘、鼠标来代替另一台电脑的
键盘、鼠标的操作。对于显示,我可以用实时的抓屏实现。
有这方面认识的朋友们帮帮小弟吧~!
 
Sleep一般用来交出CPU时间片。还有就是一些周期性的东西,比如每过5分钟检查一下是否掉线之类的应用。
WaitForSingleObject通常配合一个互斥量用来同步两个线程。
两个函数应用的方面不同!
 
后退
顶部