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

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

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

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

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

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

操作 

参照先 

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

pthread_rwlockattr_init の構文」

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

pthread_rwlockattr_destroy の構文」

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

pthread_rwlockattr_setpshared の構文」

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

pthread_rwlockattr_getpshared の構文」

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

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

pthread_rwlockattr_init の構文

#include <pthread.h>

int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

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

pthread_rwlockattr_init の戻り値

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


ENOMEM

説明:

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

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

pthread_rwlockattr_destroy(3C) は、読み取り/書き込みロック属性を削除します。

pthread_rwlockattr_destroy の構文

#include <pthread.h>

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

削除したオブジェクトを、pthread_rwlockattr_init() を呼び出して再び初期化する前に使った場合、その結果は未定義です。実装によっては、pthread_rwlockattr_destroy() により、attr が参照するオブジェクトに不正な値が設定される場合もあります。

pthread_rwlockattr_destroy の戻り値

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


EINVAL

説明:

attr で指定された値が無効です。

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

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

pthread_rwlockattr_setpshared の構文

#include <pthread.h>
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared);

pshared ロック属性は、次のいずれかの値を持ちます。


PTHREAD_PROCESS_SHARED

説明:

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


PTHREAD_PROCESS_PRIVATE

説明:

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

pthread_rwlockattr_setpshared の戻り値

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


EINVAL

説明:

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

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

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

pthread_rwlockattr_getpshared の構文

#include <pthread.h> 
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, 
          int *restrict pshared);

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

pthread_rwlockattr_getpshared の戻り値

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


EINVAL

説明:

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