pthreads、mq_timedreceive、pthread_cond_timedwait 和 CLOCK_REALTIME

tre*_*ger 5 pthreads message-queue condition-variable

我正在使用一个实现了两个 posix 函数的系统

mq_timedreceive() and pthread_cond_timedwait()
Run Code Online (Sandbox Code Playgroud)

这两个函数都使用基于 CLOCK_REALTIME 的绝对超时。该时钟在系统启动过程中的不同时间会发生变化,并且可以向后或向前移动 10 秒到几小时。

开放组说道:

如果支持Timers选项,则超时应基于CLOCK_REALTIME时钟;如果不支持 Timers 选项,则超时应基于 time() 函数返回的系统时钟。(mq_timedreceive)

对于操作员不连续地提前系统时钟的情况,预计实现会处理在中间时间到期的任何定时等待,就好像该时间实际上已经发生一样。(pthread_cond_timedwait())。

然而,这对于时钟向后设置的情况并没有提供任何指导。

QNX 通过提供解决了这个问题

mq_timedreceive_monotonic().
Run Code Online (Sandbox Code Playgroud)

mq_timedreceive_monotonic() 函数是 QNX Neutrino 扩展;它与 mq_timedreceive() 类似,但它使用 CLOCK_MONOTONIC,因此超时不受系统时间更改的影响。

有没有好的方法在linux中实现QNX功能?

对于 mq_timedreceive(),我可以使用 mq_receive() 和 poll()。但对于条件变量我还没有想出一个干净的方法。我可以使用计时器和信号,但这似乎太复杂了。

当然,另一个解决方案是不调整时钟或使用从 CLOCK_MONOTONIC 派生的不同时钟,但我没有自由更改设计。

caf*_*caf 4

您可以通过pthread_cond_timedwait()在初始化时更改条件变量的时钟属性来更改条件变量使用的时钟,使用pthread_condattr_setclock()

  • 谢谢!我错过了。我认为除了对通用时钟属性的间接引用之外,pthread_cond_timedwait() 文档中没有引用这一点。pthread_condattr_setclock() 交叉引用 pthread_cond_timedwait()。如果 mq_timedxxxx() 函数以类似的方式将其添加到 mq 属性中,那就太好了。 (2认同)