マルチスレッドのプログラミング

読み取り / 書き込みロック属性

読み取り / 書き込みロック によって、保護された共有リソースに対する並行する複数の読み取りと排他的な書き込みが可能になります。読み取り / 書き込みロックは単一の実体で、「読み取り」または「書き込み」モードでロック可能です。リソースを変更するには、スレッドはまず排他的な書き込みロックを獲得する必要があります。排他的に書き込みロックは、全ての読み取りロックが解放されるまで有効になりません。

データベースへのアクセスは読み取り / 書き込みロックに同期させることができます。読み取り操作によってレコードの情報が変更されることはないので、読み取り / 書き込みロックではデータベースのレコードを並行して読み取ることができます。データベースを更新する場合、書き込み操作は排他的な書き込みロックを獲得しなければなりません。

デフォルトの読み取り / 書き込みロック属性を変更するには、属性オブジェクトを宣言し、これを初期化しなければなりません。読み取り / 書き込みロック属性はアプリケーションのコードの開始位置にまとめて設定してある場合が多いので、その場所を素早く見つけて簡単に修正できます。ここで説明した読み取り / 書き込みロック属性を操作する関数を、次の表に示します。

読み書きロックに関する Solaris スレッドの実装については、「pthread に相当するものがある同期関数 - 読み取り / 書き込みロック」 を参照してください。

表 4-8 読み取り / 書き込みロック属性のルーチン

操作 

参照先 

読み取り/書き込みロック属性の初期化 

「pthread_rwlockattr_init(3T)」

読み取り/書き込みロック属性の削除 

「pthread_rwlockattr_destroy(3T)」

読み取り/書き込みロック属性の設定 

「pthread_rwlockattr_setpshared(3T)」

読み取り/書き込みロック属性の取得 

「pthread_rwlockattr_getpshared(3T)」

読み取り / 書き込みロック属性の初期化

pthread_rwlockattr_init(3T)


#include <pthread.h>

int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

pthread_rwlockattr_init(3T) は、読み取り / 書き込みロック属性オブジェクト attr の、実装によって定義されたすべての属性を、デフォルト値に初期化します。

初期化済みの読み取り / 書き込みロック属性オブジェクトを指定して pthread_rwlockattr_init を呼び出した場合、その結果は未定義です。読み取り / 書き込みロック属性オブジェクトを使って初期化された読み取り / 書き込みロックは、属性オブジェクトに影響を与えるどんな関数(削除を含む)の影響も受けないためです。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。


ENOMEM

読み取り / 書き込みロック 属性オブジェクトを初期化するためのメモリーが足りません。

読み取り / 書き込みロック属性の削除

pthread_rwlockattr_destroy(3T)


#include <pthread.h>

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

pthread_rwlockattr_destroy(3T) は、読み取り / 書き込みロック属性オブジェクトを削除します。削除したオブジェクトを、pthread_rwlockattr_init() の呼び出しによって再び初期化する前に使った場合、その結果は未定義です。実装によっては、pthread_rwlockattr_destroy() は、attr が参照するオブジェクトに不正な値を設定する場合もあります。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。


EINVAL

attr が示す値は無効です。

読み取り / 書き込みロック属性の設定

pthread_rwlockattr_setpshared(3T)


#include <pthread.h>

int pthread_rwlockattr_setpshared(pthread_rwlockattr_t  *attr, int  pshared);

pthread_rwlockattr_setpshared(3T) は、プロセス共有の読み取り / 書き込みロック属性を設定します。


PTHREAD_PROCESS_SHARED

読み取り / 書き込みロックが割り当てられているメモリーにアクセスできるすべてのスレッドに、読み取り / 書き込みロックの操作を許可します。複数のプロセスによって共有されているメモリに置かれた読み取り / 書き込みロックに対しても有効です。


PTHREAD_PROCESS_PRIVATE

読み取り / 書き込みロックを操作できるのは、そのロックを初期化したスレッドと同じプロセス内で作成されたスレッドだけです。異なるプロセスのスレッドから読み取り / 書き込みロックを操作しようとした場合、その結果は未定義です。プロセス共有の属性のデフォルト値は、PTHREAD_PROCESS_PRIVATE です。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。


EINVAL

attr または pshared が示す値は無効です。

読み取り / 書き込みロック属性の取得

pthread_rwlockattr_getpshared(3T)


#include <pthread.h>

int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t  *attr, int *pshared);

pthread_rwlockattr_getpshared(3T) は、プロセス共有の読み取り / 書き込みロック属性を取得します。

pthread_rwlockattr_getpshared() は、attr が参照する初期化済みの属性オブジェクトから、プロセス共有の属性の値を取得します。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。


EINVAL

attr または pshared が示す値は無効です。