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

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

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

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

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

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

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

操作 

参照先 

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

pthread_rwlockattr_init(3THR)

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

pthread_rwlockattr_destroy(3THR)

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

pthread_rwlockattr_setpshared(3THR)

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

pthread_rwlockattr_getpshared(3THR)

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

pthread_rwlockattr_init(3THR)


#include <pthread.h>

int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

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

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

戻り値

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


ENOMEM

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

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

pthread_rwlockattr_destroy(3THR)


#include <pthread.h>

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

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

戻り値

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


EINVAL

attr が示す値は無効です。

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

pthread_rwlockattr_setpshared(3THR)


#include <pthread.h>

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

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


PTHREAD_PROCESS_SHARED

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


PTHREAD_PROCESS_PRIVATE

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

戻り値

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


EINVAL

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

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

pthread_rwlockattr_getpshared(3THR)


#include <pthread.h>

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

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

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

戻り値

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


EINVAL

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