1

我正在尝试在进行一些轮询的 C++ 方法中实现超时。该方法当前看起来像这样(没有超时):

do {
    do_something();
    usleep(50);
} while(!is_finished());

该解决方案应具有以下属性:

  • 应该在系统时间的变化中幸存下来
  • 以毫秒为单位的超时(一些抖动是可以接受的)
  • POSIX 兼容
  • 不应使用信号(是库的一部分,避免副作用)
  • 可能会使用 Boost

I am currently thinking about using clock() and do something like this:

start = clock();

do {
    do_something();
    usleep(50); // TODO: do fancy stuff to avoid waiting after the timeout is reached

    if(clock() - start > timeout * CLOCKS_PER_SEC / 1000) break;
} while(!is_finished());

Is this a good solution? I am trying to find the best possible solution as this kind of task seems to come up quite often.

What is considered best practice for this kind of problem?

Thanks in advance!

4

2 回答 2

1

clock如果您想要便携,这不是正确的选择。在符合标准的系统上,这是您的进程使用的 CPU 时间,在 Windows 上,它似乎是挂钟时间。在当前的 POSIX 中也usleep已过时,您应该使用nanosleep.

有一种方法可以适用于更广泛的平台,select. 此调用有第五个参数,可让您设置超时。您可以(错误地)使用它来等待您知道永远不会发生的网络事件,然后在一段受控的时间后超时。从 linux 手册中:

一些代码调用select()所有三个集合都为空、nfds零和非NULL超时,这是一种相当可移植的亚秒精度睡眠方式。

于 2013-09-21T06:17:48.847 回答
1

任何不专门提供实时支持的操作系统都无法实现精确到毫秒的超时。

如果您的系统负载很重(即使是暂时的),它很可能会在几秒钟内无响应。有时,标准(非实时)系统会因为明显愚蠢的原因(例如访问 CD-Rom 设备)变得非常无响应。

Linux 有一些实时变化,而对于 Windows IIRC,唯一的实时解决方案实际上有一个实时内核,用于管理运行 Windows 系统的硬件,基本上在虚拟机中“模拟”。

于 2013-09-21T05:43:30.840 回答