首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的睡眠函数错误

问C++中的睡眠函数错误
EN

Stack Overflow用户
提问于 2010-05-28 15:58:42
回答 5查看 992关注 0票数 3

我有一个数据转储文件,里面有不同的时间戳数据,我从时间戳中获得了时间,并让我的c线程在那个时间休眠。但问题是,实际的时差是10秒,而我在接收端接收的数据几乎有14,15秒的延迟。我使用的是window操作系统。请指点一下。

很抱歉我这一周的英语。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-28 16:16:20

如果我理解得好的话:

  • 你有一个发送数据的线程(通过网络?数据的来源是什么?)
  • 您可以使用sleep
  • 减慢发送节奏。接收到的数据(在网络的另一端)可以延迟更多(15秒而不是10秒)

如果上面描述了你正在做的事情,那么你的设计有几个缺陷:

  • 睡眠是非常不精确的,它将等待至少n秒,但它可能更多(特别是如果你的系统是由其他正在运行的apps).
  • networks加载的话)引入一个缓冲延迟,你不能保证你的数据会立即在线路上发送(通常不会)。
  • 本身引入了一些延迟(延迟),如果你的协议等待来自接收端的确认,你应该考虑到这一点。
  • 你还应该考虑读取/构建/检索要发送的数据并真正通过线路发送所需的时间。根据您正在做的事情,它可能可以忽略不计,也可能需要几秒钟的时间--

如果您提供更多详细信息,将更容易诊断出问题的根源。你认为的sleep (它确实是一个很差的计时器)或者你系统的其他部分。

如果您的转储很大,我打赌额外的时间来自读取数据并通过网络发送数据。你应该测量发送过程中消耗的时间(发送前和发送完成后的读取时间)。

如果这确实是额外时间的来源,您只需从下一次等待时间中删除该时间。

示例:发送前一个数据块花费了4s,下一个块是10s后,但由于您已经消耗了4s,所以您只需等待6s。

sleep仍然是一个非常不精确的计时器,显然,如果发送时间大于两次发送之间的延迟,上述机制将不起作用,但你已经明白了。

纠正睡眠在windows环境中并不像在unixes中那么糟糕。windows睡眠的准确度是毫秒,unix睡眠的准确度是第二。如果你不需要高精度的计时(如果涉及到网络,高精度的计时无论如何都是遥不可及的),睡眠应该是可以的。

票数 2
EN

Stack Overflow用户

发布于 2010-05-28 16:01:31

休眠功能将至少在您指定的时间内休眠,但不能保证它不会休眠longer.If您需要一个准确的间隔,您将需要使用一些其他机制。

票数 3
EN

Stack Overflow用户

发布于 2010-05-28 16:04:01

任何现代的多任务操作系统的调度程序都不能保证任何用户应用程序的精确计时。你可以尝试以某种方式为你的应用程序分配‘实时’优先级,比如从windows任务管理器。看看有没有帮助。

另一种解决方案是实现“受控”睡眠,即一系列500ms的睡眠,检查它们之间的当前时间戳。所以,如果你的睡眠时间是1秒而不是500毫秒,你会注意到这一点,并且不会做额外的睡眠(500毫秒)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2927448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档