日本語 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.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
RWLOCK(9) FreeBSD カーネル開発者マニュアル RWLOCK(9) 名称 rwlock, rw_init, rw_init_flags, rw_destroy, rw_rlock, rw_wlock, rw_runlock, rw_wunlock, rw_unlock, rw_try_rlock, rw_try_upgrade, rw_try_wlock, rw_downgrade, rw_sleep, rw_initialized, rw_wowned, rw_assert, RW_SYSINIT, RW_SYSINIT_FLAGS -- カーネル読み込み側/書き込み側 (reader/writer) ロック 書式 #include <sys/param.h> #include <sys/lock.h> #include <sys/rwlock.h> void rw_init(struct rwlock *rw, const char *name); void rw_init_flags(struct rwlock *rw, const char *name, int opts); void rw_destroy(struct rwlock *rw); void rw_rlock(struct rwlock *rw); void rw_wlock(struct rwlock *rw); int rw_try_rlock(struct rwlock *rw); int rw_try_wlock(struct rwlock *rw); void rw_runlock(struct rwlock *rw); void rw_wunlock(struct rwlock *rw); void rw_unlock(struct rwlock *rw); int rw_try_upgrade(struct rwlock *rw); void rw_downgrade(struct rwlock *rw); int rw_sleep(void *chan, struct rwlock *rw, int priority, const char *wmesg, int timo); int rw_initialized(const struct rwlock *rw); int rw_wowned(const struct rwlock *rw); options INVARIANTS options INVARIANT_SUPPORT void rw_assert(const struct rwlock *rw, int what); #include <sys/kernel.h> RW_SYSINIT(name, struct rwlock *rw, const char *desc); RW_SYSINIT_FLAGS(name, struct rwlock *rw, const char *desc, int flags); 解説 読み込み側/書き込み側 (reader/writer) ロックによって、複数のスレッドに よって保護されたデータへの共有アクセスができるか、または単一のスレッドに よって排他的なアクセスができます。共有アクセスがあるスレッドは、それらが 保護されたデータを読み込めるだけであるので、reader として知られています。 排他的なアクセスがあるスレッドは、保護されたデータを変更することができる ので、writer として知られています。 読み込み側/書き込み側 (reader/writer) ロックは、sx(9) ロックとよく似てい るように見えますが、それらの使用法のパターンは異なっています。共有/排他的 セマンティクスでミューテックス (mutex) (mutex(9) を参照) として、読み込み 側/書き込み側 (reader/writer) ロックを取りを扱うことができます。sx(9) と 異なって、非 spin ミューテックスを保持している間に rwlock をロックするこ とができ、スリープしている間に、rwlock を保持することはできません。rwlock ロックには、ミューテックスのような優先権伝播がありますが、優先権を書き込 み側のみ伝播することができます。この制限は、読み込み側が匿名であるという 事実によります。別の重要な特性は、読み込み側が、常に繰り返すことがができ ることであり、排他的ロックを選択的に繰り返すことができます。 マクロと関数 rw_init(struct rwlock *rw, const char *name) 名前 name によって説明される、読み込み側/書き込み側 (reader/writer) ロックとして rw に位置する構造体を初期化します。 説明は、もっぱらデバッグの目的に使用されます。この関数は、ロック において任意の他の操作の前に呼び出されなければなりません。 rw_init_flags(struct rwlock *rw, const char *name, int opts) ちょうど rw_init() 関数のような rw ロックを初期化しますが、opts 引数を通して、rw の振る舞いを変更するための 1 組のオプションのフ ラグの指定します。次のフラグの 1 つ以上を含みます: RW_DUPOK witness (目撃者) は、獲得される複製されたロックに関 するメッセージをログ記録するべきではありません。 RW_NOPROFILE このロックのプロファイルを行いません。 RW_NOWITNESS このロックを無視するように witness(4) に指示しま す。 RW_QUIET ktr(4) を通してこのロックのための任意の操作をログ記 録しません。 RW_RECURSE スレッドは、rw のために排他的なロックを再帰的に獲得 できます。 RW_NEW カーネルが option INVARIANTS でコンパイルされたな ら、rw_init_flags() は、rw が、このオプションが指定 されないなら、介在されている rw_destroy() への呼び 出しなしで、何度も初期化されていないことをアサート します。 rw_rlock(struct rwlock *rw) 読み込み側 (reader) として rw をロックします。任意のスレッドが排 他的にこのロックを保持するなら、現在のスレッドは、ブロックし、そ の優先権は、排他的な保持者に伝播されます。スレッドが rw で既に読 み込み側 (reader) アクセスを取得しているとき、rw_rlock() 関数を呼 び出すことができます。これは、``ロックでの繰り返し'' (recursing on a lock) と呼ばれます。 rw_wlock(struct rwlock *rw) 書き込み側 (writer) として rw をロックします。ロックの共有された 所有者がいるなら、現在のスレッドは、ブロックします。RW_RECURSE オ プションが有効にされている状態で rw が初期化された場合にだけ、 rw_wlock() 関数を再帰的に呼び出すことができます。 rw_try_rlock(struct rwlock *rw) 読み込み側 (reader) として rw をロックしようとします。この関数 は、操作が成功するなら、真を返し、そうでなければ、0 を返します。 rw_try_wlock(struct rwlock *rw) 書き込み側 (writer) として rw をロックしようとします。この関数 は、操作が成功するなら、真を返し、そうでなければ、0 を返します。 rw_runlock(struct rwlock *rw) この関数は、以前に rw_rlock() によって獲得された共有されたロック を解放します。 rw_wunlock(struct rwlock *rw) この関数は、以前に rw_wlock() によって獲得された排他的なロックを 解放します。 rw_unlock(struct rwlock *rw) この関数は、以前に rw_rlock() によって獲得された共有ロックか、ま たは以前に rw_wlock() によって獲得された排他的なロックを解放しま す。 rw_try_upgrade(struct rwlock *rw) 単一の共有されたロックを排他的なロックにアップグレードすることを 試みます。現在のスレッドは、rw の共有されたロックを保持していなけ ればなりません。現在のスレッドが rw で共有されたロックのみを保持 している場合にだけ、これは成功し、単一の共有されたロックのみを保 持します。試みが成功するなら、rw_try_upgrade() は、0 以外の値を返 し、現在のスレッドは、排他的なロックを保持します。試みが失敗する なら、rw_try_upgrade() は、0 を返し、現在のスレッドは、そのまま共 有されたロックを保持します。 rw_downgrade(struct rwlock *rw) 排他的なロックを単一の共有されたロックに変換します。現在のスレッ ドは、rw の排他的なロックを保持していなければなりません。 rw_sleep(void *chan, struct rwlock *rw, int priority, const char *wmesg, int timo) イベントを待っている間に、不可分に rw を解放します。この関数への パラメータに関するより詳しい情報については、sleep(9) を参照してく ださい。 rw_initialized(const struct rwlock *rw) この関数は、rw が初期化されたなら 0 以外を返し、そうでなければ、0 を返します。 rw_destroy(struct rwlock *rw) この関数は、以前に rw_init() で初期化されたロックを破壊します。rw ロックは、アンロックされていなければなりません。 rw_wowned(const struct rwlock *rw) この関数は、現在のスレッドが rw で排他的なロックを所有しているな ら、0 以外を返します。 rw_assert(const struct rwlock *rw, int what) この関数によって、what で指定されたアサーションを、rw に関して行 うことができます。アサーションが真でなく、カーネルが options INVARIANTS と options INVARIANT_SUPPORT でコンパイルされているな ら、カーネルは、パニックします。現在、次の基本的なアサーションが サポートされています: RA_LOCKED 現在のスレッドが rw の共有されるか、または排他的な ロックを保持しているかアサートします。 RA_RLOCKED 現在のスレッドが、rw の共有されたロックを保持してい るかアサートします。 RA_WLOCKED 現在のスレッドが、rw の排他的なロックを保持している かアサートします。 RA_UNLOCKED 現在のスレッドが、rw の共有されたロックも排他的な ロックも保持していないかアサートします。 さらに、次のオプションのフラグの 1 つは、RA_LOCKED, RA_RLOCKED ま たは RA_WLOCKED で指定されます: RA_RECURSED 現在のスレッドが、rw の再帰的なロックを保持するこ とをアサートします。 RA_NOTRECURSED 現在のスレッドが、rw の再帰的なロックを保持しない ことをアサートします。 関連項目 locking(9), mutex(9), panic(9), sema(9), sx(9) 歴史 これらの関数は FreeBSD 7.0 で登場しました。 作者 rwlock 機能は John Baldwin によって書かれました。このマニュアルページは Gleb Smirnoff によって書かれました。 バグ WITNESS なしのカーネルは、現在のスレッドが、読み込み側 (reader) ロックを 保持するかどうかにかかわらず、アサートすることができません。RA_LOCKED と RA_RLOCKED は、あらゆるスレッドが読み込み側 (reader) ロックを保持すること だけアサートすることができます。それらは、現在のスレッドが、読み込み側 (reader) ロックを保持することを保証することはできません。さらに、 RA_UNLOCKED は、現在のスレッドが書き込み側ロックを保持しないことだけア サートすることができます。 読み込み側/書き込み側 (reader/writer) は、ちょっとまずい名前です。また、 お好みで、rwlock は、``Robert Watson'' ロックとも呼ばれます。 FreeBSD 11.2 November 11, 2017 FreeBSD 11.2