std::this_thread::sleep_for 的用法和注意事项
1)使用说明
std::this_thread::sleep_for函数是C11的休眠函数,表示当前线程休眠一段时间,休眠期间不与其他线程竞争CPU,根据线程需求,等待若干时间。
由于是一个跨平台的函数,因此在代码中大量应用,避免了在不同平台之间所以通过宏定义编译问题。在windows下,可以简单替代Sleep, 在Linux下,替代usleep
2)调用例子
头文件定义:#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(50));//睡眠50毫秒
3)延申boost sleep_for
基本作用跟std::this_thread::sleep_for是一样的
头文件定义:#include <boost/thread.hpp>
调用例子:boost::this_thread::sleep_for(boost::chrono::milliseconds(1000));//延时1秒
4)异常情况
如果将时间修改为过去的时间,该函数会一直阻塞,直到机器时间重新走到修改前的时间,才会唤醒线程。例如当前时间是10:30,修改时间为10:20, sleep_for函数会一直阻塞,直到时间重新走到10:30才重新唤醒。将时间修改为将来的时间,没有问题。并且使用Sleep函数在任何情况下也没有问题,跟系统时间没有关系。
总结:如果系统的时间来回跳变,会影响到sleep_for函数的正常唤醒,从而影响到调用该函数线程的执行状况,并且是上述两种函数都有这个问题
使用经验:最好在各自库创建线程中调用对应的函数,std::thread调用std::this_thread::sleep_for函数,boost::thread调用boost::this_thread::sleep_for
5)通过如下的案例,可以知道系统的时间会严重影响上述两个函数的调用,需要格外注意
启动流媒体之后,只能控制半分钟云台,视频可以正常播放。最终定位到代码std::this_thread::sleep_for(std::chrono::milliseconds(50));阻塞,没有正常结束休眠,被系统唤醒,执行。通过修改为::Sleep函数,可以解决问题。根本原因是系统开启了自动设置时间,系统存在时间跳变,正常走半分钟,然后会跳到过去的某一个时间,继续走半分钟,然后继续跳到当前的时间往下走,最终通过关闭自动设置时间,解决问题
排查过程
1)怀疑现场摄像机SDK版本不支持,更新之后,效果一样
(可以使用更新SDK中的DEMO测试,就可以知道是否是SDK的问题)
2)将流媒体部署到客户端电脑正常运行(至少有了备用的方案)
3)根据现场部署的操作系统Windows Server 2016 DataCenter,在公司虚拟机部署一套,运行正常,现场运行环境是实体服务器,对操作系统方面也是有疑问
上一篇: 7-HC32F460(UW 微控制器)-定时器 0
下一篇: Date