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 派生的不同时钟,但我没有自由更改设计。
您可以通过pthread_cond_timedwait()在初始化时更改条件变量的时钟属性来更改条件变量使用的时钟,使用pthread_condattr_setclock()。