日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
LIBTHR(3) FreeBSD ライブラリ関数マニュアル LIBTHR(3) 名称 libthr -- 1:1 POSIX スレッドライブラリ ライブラリ 1:1 スレッドライブラリ (libthr, -lthr) 書式 #include <pthread.h> 解説 libthr ライブラリは、アプリケーションのスレッドのための pthread(3) ライブ ラリインタフェースの 1:1 実装を提供します。それは、システムスコープスレッ ドセマンティクスを予想するアプリケーションによって使用するために最適化さ れます。 ライブラリは、実行時リンクエディタ ld-elf.so.1(1) と標準 C ライブラリ (libc, -lc) としっかり統合されます。すべての 3 つの構成要素は、同じソース ツリーから構築されなければなりません。FreeBSD の異なるバージョンの libc と libthr のライブラリを混合は、サポートされません。実行時のリンカ ld elf.so.1(1) には、libthr のより古いバージョンとの後方互換性を保証するため のいくつかのコードがあります。 マニュアルページは、libthr の振る舞いと調整変数を文書化しています。 -lpthread でリンクするとき、実行時の依存関係 libthr.so.3 は、生成されたオ ブジェクトに記録されます。 ミューテックの獲得 ロックされたミューテック (pthread_mutex_lock(3) を参照) は、ロックを所有 するスレッドのグローバルなシステム識別子を記録する、タイプ lwpid_t の volatile (揮発性) の変数によって表わされます。libthr は、3 つの段階の競わ れたミューテックの獲得を行ない、その各々は、以前のものより、よりリソース を消費します。最初の 2 つの段階は、PTHREAD_MUTEX_ADAPTIVE_NP タイプと PTHREAD_PRIO_NONE プロトコル (pthread_mutexattr(3) を参照) のミューテック のためにのみ適応されます。 最初に、SMP システムで、スピンループは、ライブラリが、atomic(9) 操作に よってロックを獲得することを試みるところで、行なわれます。ループカウント は、2000 のデフォルト値で、LIBPTHREAD_SPINLOOPS 環境変数によって制御され ます。 スピンループがミューテックを獲得することができなかっなら、イールド (yield) ループは、スピンループとして同じ atomic(9) の獲得の試みを行なっ て、実行されますが、それぞれの試みは、sched_yield(2) システムコールを使用 してスレッドの CPU 時間の産出によって続けられます。デフォルトで、イールド (yield) ループは、実行されません。これは、LIBPTHREAD_YIELDLOOPS 環境変数 によって制御されます。 スピンループとイールド (yield) ループの両方がロックの獲得に失敗したなら、 スレッドは、CPU を切断し、_umtx_op(2) システムコールでカーネルでスリープ させられます。カーネルは、スレッドを起こし、ロックが利用可能になるとき、 起こされたスレッドにロックの所有権を渡します。 スレッドのスタック 各スレッドは、C の実行時に使用されるプライベートのユーザモードのスタック 領域で提供されます。メイン (初期) のスレッドのスタックのサイズは、カーネ ルによって設定され、RLIMIT_STACK プロセスリソースの制限 (getrlimit(2) を 参照) によって制御されます。 デフォルトで、メインのスレッドのスタックサイズは、プロセスのための RLIMIT_STACK の値と等しくなります。LIBPTHREAD_SPLITSTACK_MAIN 環境変数が プロセス環境 (その値は、重要ではありません) に存在するなら、メインのス レッドのスタックは、スレッド化されたライブラリが初期化されるとき、64 ビッ トのアーキテクチャで 4MB、と 32 ビットのアーキテクチャで 2MB まで減らされ ます。最初のプロセスのスタックのためにカーネルによって予約されているアド レス空間の領域の残りは、この場合に最初でないスレッドのスタックのために使 用されます。LIBPTHREAD_BIGSTACK_MAIN 環境変数の存在は、 LIBPTHREAD_SPLITSTACK_MAIN を上書きします。それは、後方互換性のために保持 されています。 pthread_create(3) 呼び出しをで実行時にプロセスによって作成されたスレッド のためのスタックのサイズは、スレッド属性によって制御されます: pthread_attr(3) 特に、pthread_attr_setstacksize(3), pthread_attr_setguardsize(3) と pthread_attr_setstackaddr(3) 関数を参照し てください。スレッドのスタックサイズのための属性が指定されないなら、デ フォルトの最初でないスレッドのスタックサイズは、64 ビットのアーキテクチャ に対して 2MB と 32 ビットのアーキテクチャに対して 1MB です。 実行時の設定 次の環境変数は、libthr によって認識され、実行時にライブラリの操作を調節し ます: LIBPTHREAD_BIGSTACK_MAIN LIBPTHREAD_SPLITSTACK_MAIN によって有効に された最初のスレッドのスタックの減少を無効 にします。 LIBPTHREAD_SPLITSTACK_MAIN セクション「スレッドのスタック」に記述され るように、最初のスレッドのスタックの減少を 引き起こします。これは、FreeBSD 11.0 の前 の libthr のデフォルト振る舞いでした。 LIBPTHREAD_SPINLOOPS 変数の整数値は、ミューテックの獲得の spin loop (スピンループ) の繰り返しのデフォルト のカウントを上書きします。デフォルトのカウ ントは、2000 で、libthr ソースの MUTEX_ADAPTIVE_SPINS 定数によって設定され ます。 LIBPTHREAD_YIELDLOOPS 0 でない整数値は、ミューテックの獲得の過程 で、イールド (yield) ループを有効にしま す。値は、ループ操作のカウントです。 LIBPTHREAD_QUEUE_FIFO 変数の整数値は、ブロックされたスレッドがそ のテール (tail) の代わりに、スリープキュー のヘッド (head) にどれくらい挿入されるかを 指定します。より大きな値は、FIFO 規律の頻 度を縮小します。値は、0 と 255 の間でなけ ればなりません。 次の sysctl MIB は、ライブラリの操作に影響します: kern.ipc.umtx_vnode_persistent デフォルトで、メモリ中のマップされた ファイルによって裏打ちされた共有ロッ クは、POSIX によって許可される、対応 するファイルのページの最後のアンマッ プで自動的に破壊されます。sysctl を 1 に設定することは、そのような共有 ロックオブジェクトを vnode が Vir tual File System によってリサイクル されるまで、持続させます。ファイルが オープンされず、マップされない場合 に、カーネルは、この sysctl を、思っ たより役に立たなくして、今すぐにも、 リサイクルすることに注意してくださ い。 kern.ipc.umtx_max_robust 1 つのスレッドのために許可された強固 な mutex の最大数。カーネルは、指定 されるより多い mutex をアンロックし ません、詳細については、_umtx_op を 参照してください。デフォルト値は、最 も役に立つアプリケーションのために十 分に大きくなっています。 debug.umtx.robust_faults_verbose アンロックされた強固な mutex が、メ モリの破損を防止する手段として、いく らかの矛盾を検出した後に、アボートし たとき、0 の値は、カーネルにいくらか の診断を出力させます、 RLIMIT_UMTXP の制限 (getrlimit(2) を参照) は、与えられたユーザが、どのく らいの共有ロックを同時に作成できるを定義します。 実行時のリンカとの相互作用 ロードにおいて、libthr は、libc によってエクスポートされたフックに干渉す るハンドラをインストールします。干渉者 (interposer) は、libc の単一スレッ ド化されたプロセス、取消しのサポート、とシグナルの操作へのいくつかの修正 のためのスタブの代わりに実際のロックの実装を提供します。 libthr は、アンロードすることができません。dlclose(3) 関数は、libthr のた めのハンドルで呼び出されるとき、あらゆるアクションを行ないません。理由の 1 つは、libc 関数の内部の干渉が未完成とできないことです。 シグナル 実装は、ユーザにインストールされた signal(3) ハンドラに干渉します。この干 渉は、ユーザに提供されるシグナルハンドラの呼び出しが安全でないところで、 (libthrの内部の) クリティカルなセクションに入るスレッドにシグナルの配信を 延期するために行われます。そのような状況の例は、内部のライブラリのロック を所有しています。シグナルが、シグナルが安全に呼ぶ出すことができない間 に、配信されるとき、呼び出しは、クリティカルなセクションから出た後まで、 延期され、実行されます。これは、ktrace(1) ログを解釈するとき、考慮に入れ られるべきです。 関連項目 ktrace(1), ld-elf.so.1(1), getrlimit(2), errno(2), thr_exit(2), thr_kill(2), thr_kill2(2), thr_new(2), thr_self(2), thr_set_name(2), _umtx_op(2), dlclose(3), dlopen(3), getenv(3), pthread_attr(3), pthread_attr_setstacksize(3), pthread_create(3), signal(3), atomic(9) 作者 libthr ライブラリは、最初に Jeff Roberson <jeff@FreeBSD.org> によって作成 され、Jonathan Mini <mini@FreeBSD.org> と Mike Makonnen <mtm@FreeBSD.org> によって機能強化されました。それは、David Xu <davidxu@FreeBSD.org> によっ て、大幅に書き直されて、最適化されました。 FreeBSD 11.4 May 17, 2016 FreeBSD 11.4