20

pthread_mutex_timedlockのドキュメントにはabs_timeoutCLOCK_REALTIME. ただし、(システム時間の調整のため) 特定の期間のタイミングを計るのに不適切であることは誰もが知っています。

CLOCK_MONOTONIC移植可能な pthread ロックタイムアウトを作成する方法はありますか? 同じことが pthread_cond_timedwait にも当てはまります。

4

3 に答える 3

22

ドキュメントと を見たところ、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()ようです。誰かが時計を設定しないことを祈る必要があると思います!

于 2013-01-18T11:23:48.627 に答える
2

kqueueOS X と FreeBSD では、とを使用できますkevent。ここで私の答えを参照してください: https://stackoverflow.com/a/31174803/432

于 2015-07-02T07:33:23.160 に答える
0

GLIBCでpthread_mutex_timedlockのクロックを変更する方法はまだありません。下位互換性のためか、MONOTONICクロックはREALTIMEよりも後に導入されたため、そのような機能を使用しているソフトウェアが多く、代替CLOCKが影響する可能性があります。

Linux のソリューション:

于 2021-11-05T15:00:16.003 に答える