1

Linux で堅牢な futex ベースの pthread ミューテックスを使用しようとしています。これは、高速で堅牢である必要があるためです (「デッド」ロックを回復する)。Linux システムの pthread ミューテックス ライブラリが堅牢な futex に基づいているかどうかを確認するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

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 が堅牢である場合は呼び出しが表示されます。

これが役立つことを願っています。

于 2014-11-19T04:19:17.680 に答える