2015-11-23 37 views
1

我與已經實現了兩個POSIX函數並行線程,mq_timedreceive,那麼pthread_cond_timedwait和CLOCK_REALTIME

mq_timedreceive() and pthread_cond_timedwait() 

這些功能都使用基於CLOCK_REALTIME絕對超時系統的工作。這個時鐘在系統啓動過程中的不同時間發生變化,並且可以在幾秒到幾個小時內向後或向前移動。

公開組說:

如果定時器選項的支持,超時應根據該 CLOCK_REALTIME時鐘;如果不支持定時器選項,則應根據時間() 函數返回的系統時鐘來確定超時時間。 (mq_timedreceive)

對於情況下,當系統時鐘由 操作不連續推進,預計實現處理任何計時等待 到期在這段時間竟彷彿已經發生的時間。 (那麼pthread_cond_timedwait())。

但是,在時鐘反向設置的情況下,這並沒有提供任何指導。

QNX通過提供

mq_timedreceive_monotonic(). 

的mq_timedreceive_monotonic()函數是一個QNX Neutrino中擴展解決了這個問題; 它與mq_timedreceive()類似,但它使用CLOCK_MONOTONIC,所以 超時不受系統時間更改的影響。

有沒有一種很好的方法來實現Linux中的QNX功能?

對於mq_timedreceive()我可以使用mq_receive()和poll()。但對於條件變量,我還沒有提出一個乾淨的方法。我可以使用itimer和信號,但似乎太複雜。

另一種解決方案當然是不要調整時鐘或使用從CLOCK_MONOTONIC派生的不同時間時鐘,但我無權改變設計。

回答

1

使用pthread_condattr_setclock(),可以通過在條件變量初始化時更改條件變量的時鐘屬性,在條件變量上更改pthread_cond_timedwait()使用的時鐘。

+0

謝謝!我錯過了。我不認爲這是在pthread_cond_timedwait()文檔中引用的,而不是斜向引用通用時鐘屬性。 pthread_condattr_setclock()不會交叉引用pthread_cond_timedwait()。如果mq_timedxxxx()函數以類似的方式將其添加到mq屬性將會很好。 –