非常にまれなケースで、システムに致命的なクラッシュが発生することがありますpthread_cond_timedwait()
。EINVAL
これは、渡されたパラメーターの 1 つが無効でなければならないことを意味することは理解していますが、mutex または cond 変数はどのように無効になりますか?
pthread_cond_timedwait()
クラッシュを防ぐために呼び出す前にこれらの引数をチェックする方法はありますか?
非常にまれなケースで、システムに致命的なクラッシュが発生することがありますpthread_cond_timedwait()
。EINVAL
これは、渡されたパラメーターの 1 つが無効でなければならないことを意味することは理解していますが、mutex または cond 変数はどのように無効になりますか?
pthread_cond_timedwait()
クラッシュを防ぐために呼び出す前にこれらの引数をチェックする方法はありますか?
何が無効であるかは正確には特定されていませんが、私が観察したいくつかの理由は次のpthread_cond_timedwait
とおりEINVAL
です。
pthread が行っている検証呼び出しを手動で模倣しないと、 を呼び出す前に引数をチェックする方法がわかりませんpthread_cond_timewait()
。ただし、特定のケースであるため、pthread_cond_timewait()
復帰EINVAL
によって致命的なクラッシュが発生することはありません。返された結果を適切に処理できない可能性のあるアプリケーション コードの他の領域を調べることを検討してください。たとえば、戻り値が でない限り成功と見なすコードETIMEDOUT
。
この問題に関する私の経験を共有したいと思います。時間値は 'timespec' であり、その 'tv_nsec' 範囲は [0, 999999999] 内に保持する必要があります。したがって、nano 値を 1 秒以上に設定すると、一部の Linux EINVAL! を返す可能性があります。
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds [0 .. 999999999] */
};
これがトラブルの解決に役立つことを願っています。