看了x司的项目代码,几乎99%地方都用Sleep(), 近乎乱用,或许不知wait存在。
其实,Sleep与WaitForSingleObject/WaitForXXXX/Wait是有很大区别的。
首先汉字翻译,已经做出了明显区分,前者是睡眠,后者是等待。
睡眠=等待?睡眠≠等待!
线程本身是有状态的,也存在几个不同状态的队列的,状态不同,它就切入到了不同的队列。
所谓的睡眠,就是挂起当前线程,主动放弃当前线程余下的时间片,线程进到了阻塞状态了。
所谓的超时等待,是给定最大超时等待,不主动放弃当前线程时间片,线程不睡眠,先进入等待队列,一旦有信号触发就会立即唤醒,线程状态切到Running,往下跑;
如果是Sleep就会放弃当前时间片并且睡眠,无法通过有信号而唤醒,一直阻塞在这里等待时间满,还会导致僵死。
所以,编程中,尽量不要用sleep去等待,特别是UI相关编程。
特别是需要根据特定信号唤醒的场景,原理上讲必须用Wait.