5

非常にまれなケースで、システムに致命的なクラッシュが発生することがありますpthread_cond_timedwait()EINVALこれは、渡されたパラメーターの 1 つが無効でなければならないことを意味することは理解していますが、mutex または cond 変数はどのように無効になりますか?

pthread_cond_timedwait()クラッシュを防ぐために呼び出す前にこれらの引数をチェックする方法はありますか?

4

2 に答える 2

13

何が無効であるかは正確には特定されていませんが、私が観察したいくつかの理由は次のpthread_cond_timedwaitとおりEINVALです。

  • 条件および/またはミューテックスが正しく初期化されていません。初期化の戻り結果を確認し、正しい pthread ライブラリーが明示的にリンクされていることを確認してください。さまざまなバージョンの glibc がリンクされていると、散発的な問題が発生する可能性があります。その結果、init 呼び出しが成功を返しても、オブジェクトが正しく初期化されないというデバッグが困難になります。
  • 未定義の動作は無効な内部状態になる可能性があり、pthread 呼び出しによって検出される場合と検出されない場合があります。未定義の動作は、次の場合に発生する可能性があります。
    • ミューテックスまたは条件変数を破棄せずに複数回初期化する。
    • 破棄された後、再初期化される前にミューテックスまたは条件変数を使用する。
    • 条件および/またはミューテックスは、アプリケーション コードによって手動で上書きされました。
    • スレッドがオブジェクトを待機している間に、ミューテックスまたは条件変数が破棄されました。
  • 同じ条件変数で異なるミューテックスが使用されています。
  • abstime引数のtv_nsec 値が 0 未満または 1,000,000,000 を超えていました。

pthread が行っている検証呼び出しを手動で模倣しないと、 を呼び出す前に引数をチェックする方法がわかりませんpthread_cond_timewait()。ただし、特定のケースであるため、pthread_cond_timewait()復帰EINVALによって致命的なクラッシュが発生することはありません。返された結果を適切に処理できない可能性のあるアプリケーション コードの他の領域を調べることを検討してください。たとえば、戻り値が でない限り成功と見なすコードETIMEDOUT

于 2012-07-03T22:56:36.403 に答える
5

この問題に関する私の経験を共有したいと思います。時間値は 'timespec' であり、その 'tv_nsec' 範囲は [0, 999999999] 内に保持する必要があります。したがって、nano 値を 1 秒以上に設定すると、一部の Linux EINVAL! を返す可能性があります。

struct timespec {
    time_t tv_sec;      /* Seconds */
    long   tv_nsec;     /* Nanoseconds [0 .. 999999999] */ 
};

これがトラブルの解決に役立つことを願っています。

于 2013-07-02T08:02:37.007 に答える