欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

std::this_thread::sleep_for 的用法和注意事项

最编程 2024-07-09 21:42:37
...

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,在公司虚拟机部署一套,运行正常,现场运行环境是实体服务器,对操作系统方面也是有疑问