Linux で堅牢な futex ベースの pthread ミューテックスを使用しようとしています。これは、高速で堅牢である必要があるためです (「デッド」ロックを回復する)。Linux システムの pthread ミューテックス ライブラリが堅牢な futex に基づいているかどうかを確認するにはどうすればよいですか?
ありがとう!
futex(2)
システム コールがあり、それが使用されている場合 ( mutexstrace(1)
を使用する 10 行のアプリケーションのみ)、futex(2)
システム コールは堅牢性がカーネルに組み込まれた後にのみカーネルに入るため、堅牢な機能があります。これは、堅牢な futex を使用していることを意味するのではなく、カーネルに機能があることを意味します。
次に、libc がそれをサポートしているかどうかを知りたいと思います。2.9 より上のすべてのバージョンでサポートされています。バージョンを確認してください。
マルチスレッドアプリケーションを作成している場合、スレッドを制御し、スレッドが死ぬ前に使用するミューテックスを解放するか、クリーンアップ関数を登録してロックを解放することを確認できるため、futex の堅牢性は実際には必要ありません。 (そのための pthread api があります)。それでも心配な場合は、とにかく堅牢なミューテックスの使用に関する以下のメモを参照してください。
マルチスレッドアプリケーションで堅牢なfutexを使用したい場合、パフォーマンスにお金がかかることを明確にして明確にしたいだけです. 堅牢な futex の主な用途は、1 つのコンポーネントが残りのコンポーネントを強制終了せずに終了する可能性が高いマルチプロセス アプリケーションで同期プリミティブとして使用することです。スレッドはアプリケーション全体の死を意味します。
マルチスレッドまたはマルチプロセス アプリケーションで堅牢な futex を使用するには、文書化されていない関数 を使用して、futex を堅牢としてマークする必要がありますpthread_mutexattr_setrobust(3)
。その機能に関するドキュメントを追加するために、マニュアル ページの管理者にバグ レポートを提出しました。PTHREAD_MUTEX_ROBUST
どちらがデフォルトであるかとは対照的に、その関数に渡す必要がPTHREAD_MUTEX_STALLED
あります。
マルチスレッド アプリケーションでは、mutex を堅牢としてマークするだけで済みます。
マルチプロセスアプリケーションで堅牢なfutexを使用するには、(幸いにも文書化された)関数pthread_mutexattr_setpshared(3)
を呼び出して渡すPTHREAD_PROCESS_SHARED
ことにより、futexがプロセス間で共有されていることをマークする必要もあります。これは、デフォルトとは対照的ですPTHREAD_PROCESS_PRIVATE
。
実際にstrace(1)
は、ロックの取得と解放は表示されませんがset_robust_list(2)
、futex が堅牢である場合は呼び出しが表示されます。
これが役立つことを願っています。