pthread_mutex_timedlockのドキュメントにはabs_timeout
、CLOCK_REALTIME
. ただし、(システム時間の調整のため) 特定の期間のタイミングを計るのに不適切であることは誰もが知っています。
CLOCK_MONOTONIC
移植可能な pthread ロックタイムアウトを作成する方法はありますか? 同じことが pthread_cond_timedwait にも当てはまります。
ドキュメントと を見たところ、pthread_mutex_timedlockを使用pthread.h
する方法が見つからないため、(現在)不可能であると思います。ただし、 pthread_cond_timedwaitの場合は、次のようなコードを使用できます。CLOCK_MONOTONIC
pthread_condattr_t attr;
pthread_cond_t cond;
/* ... */
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);
わかりやすくするためにエラー コードのチェックは省略しましたが、もちろんそうすべきです。
CLOCK_REALTIME
原則CLOCK_MONOTONIC
としてオプションですが、常に使用できるため、使用されていると思います。また、絶対タイムアウトを設定すると、システムコールがシグナルなどで中断された後に回復しやすくなるのだろうか。
ただし、時計を設定できる場合と設定できない場合があるというのは、まったく矛盾しているpthread_mutexattr_setclock()
ようです。誰かが時計を設定しないことを祈る必要があると思います!
kqueue
OS X と FreeBSD では、とを使用できますkevent
。ここで私の答えを参照してください: https://stackoverflow.com/a/31174803/432
GLIBCでpthread_mutex_timedlockのクロックを変更する方法はまだありません。下位互換性のためか、MONOTONICクロックはREALTIMEよりも後に導入されたため、そのような機能を使用しているソフトウェアが多く、代替CLOCKが影響する可能性があります。
Linux のソリューション: