名称
pthread_mutexattr_getpshared(), pthread_mutexattr_setpshared(), pthread_mutexattr_gettype(),
pthread_mutexattr_settype() ― プロセス共有属性と type 属性の取得/設定
構文
#include <pthread.h>
int pthread_mutexattr_setpshared(pthread_mutexattr_t
*attr,
int pshared);
int pthread_mutexattr_getpshared(const pthread_mutexattr_t
*attr,
int *pshared);
int pthread_mutexattr_settype(pthread_mutexattr_t
*attr, int type);
int pthread_mutexattr_gettype(const pthread_mutexattr_t
*attr,
int *type);
パラメータ
| attr | | 属性の設定または取得の対象とする mutex 属性オブジェクトへのポインター。 |
| pshared | | このパラメータは、 プロセス共有 属性の新しい値を指定する (set 関数) か、 attr の プロセス共有 属性が返されるメモリー領域を指します (get 関数)。 |
| type | | このパラメータは、 type 属性の新しい値を指定する (set 関数) か、 attr の type 属性が返されるメモリー領域を指します (get 関数)。 |
説明
これらの関数を呼び出す前に、属性オブジェクト attr を関数 pthread_mutexattr_init() で前もって初期化していなければなりません。
属性:pshared
mutex は、1 つのプロセス内のスレッドでのみ使用することも、複数のプロセスのスレッド間で共有することもできます。
mutex 属性オブジェクトの プロセス共有 属性は、その mutex が使用できるスレッドの範囲を指定します。 プロセス共有 属性の正当な値は、次のとおりです。
| PTHREAD_PROCESS_SHARED |
| | | このオプションにより、mutex が割り当てられているメモリーにアクセスできる任意のスレッドによって、mutex を操作できます。
アプリケーションでは、複数のプロセスがアクセスできるメモリー上に mutex を割り当てます。 |
| PTHREAD_PROCESS_PRIVATE |
| | | mutex を初期化したスレッドと同じプロセス内で作成されたスレッドでのみ、mutex を操作できます。
異なるプロセスのスレッドがその mutex を操作しようとした場合、結果は不定です。 |
プロセス共有 のデフォルト値は、 PTHREAD_PROCESS_PRIVATE です。
pthread_mutexattr_setpshared() は、 attr に プロセス共有 属性を設定するために使用されます。 attr の プロセス共有 属性の新しい値は、 pshared パラメータで指定された値に設定されます。
pthread_mutexattr_getpshared() は、 attr から プロセス共有 属性の値を取得します。 attr の プロセス共有 属性の値は、 pshared パラメータに返されます。
属性:type
mutex は、異なる 4 つの形式で作成することができます。 mutex の形式は、mutex 属性オブジェクトの type 属性に含まれます。 type 属性の有効な値は、次のとおりです。
| PTHREAD_MUTEX_NORMAL |
| | | この形式の mutex では、デッドロックの検出は行われません。
スレッドがこの mutex を、最初にロックを解除しないまま再度ロックしようとすると、そのスレッドはデッドロックします。
呼び出し元にはエラーは返されません。 別のスレッドがロックした mutex のロックを解除しようとすると、結果は不定です。
ロックを解除された mutex に対して再度ロック解除しようとすると、結果は不定です。 |
| PTHREAD_MUTEX_ERRORCHECK |
| | | この形式の mutex では、エラーチェックが行われます。 所有者フィールドはそのまま保持されます。
mutex のロックの所有者だけが、この mutex のロックを正常に解除できます。
この mutex を再度ロックしようとするスレッドには、エラーが返されます。
別のスレッドがロックした mutex のロックを解除しようとしたスレッドには、エラーが返されます。
ロックが解除された mutex を再度ロック解除しようとするスレッドには、エラーが返されます。
この形式の mutex は、デバッグに便利です。 |
| PTHREAD_MUTEX_RECURSIVE |
| | | この形式の mutex では、デッドロックは起こり得ません。
所有者フィールドはそのまま保持されます。 スレッドがこの mutex を再度ロックしようとすると、mutex は正常にロックされます。
この mutex を複数回ロックする場合は、mutex を解放して別のスレッドが mutex をロックできるようにするため、同じ回数ロックを解除する必要があります。
別のスレッドがロックした mutex のロックを解除しようとしたスレッドには、エラーが返されます。
ロックが解除された mutex を再度ロック解除しようとするスレッドには、エラーが返されます。 |
| PTHREAD_MUTEX_NO_OWNER_NP |
| | | この形式の mutex では、デッドロックの検出は行われません。
スレッドがこの mutex を、最初にロックを解除しないまま再度ロックしようとすると、そのスレッドはデッドロックします。
呼び出し元にはエラーは返されません。 この形式の mutex は、所有者以外のスレッドでもロック解除することができます。
ロック解除された mutex に対して再度ロック解除しようとすると、結果は不定です。 |
| PTHREAD_MUTEX_DEFAULT |
| | | この形式の mutex を再帰的にロックしようとすると、結果は不定です。
別のスレッドがロックした mutex のロックを解除しようとすると、結果は不定です。
ロックが解除された mutex を再度ロック解除しようとすると、結果は不定です。
この mutex を他のいずれかの形式の mutex にマッピングする実装も許可されています。 |
type 属性のデフォルト値は、 PTHREAD_MUTEX_DEAFULT です。
pthread_mutexattr_settype() は、 attr に type 属性を設定するために使用されます。 attr の type 属性の新しい値は、 type パラメータで指定された値に設定されます。
pthread_mutexattr_gettype() は、 attr から type 属性の値を取り出します。 attr の type 属性の値は、 type パラメータに返されます。
PTHREAD_MUTEX_RECURSIVE の mutex には絶対に条件変数を使用しないでください。 複数回ロックされている場合、 pthread_cond_wait() または pthread_cond_timedwait() で暗示的にロックを解除しても、mutex が実際には解放されないことがあるからです。
この状況に陥ると、他のスレッドで述語の条件を満足させることができなくなります。
戻り値
正常終了すると pthread_mutexattr_getpshared(), pthread_mutexattr_setpshared(), pthread_mutexattr_gettype(), pthread_mutexattr_settype() は 0 を返します。
それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。
エラー
以下の現象が発生した場合、 pthread_mutexattr_getpshared() と pthread_mutexattr_setpshared() 関数は、該当するエラー番号を返します。
| [ENOSYS] | | _POSIX_THREAD_PROCESS_SHARED が未定義で、これらの関数がサポートされていない場合。 |
以下の条件の場合、 pthread_mutexattr_getpshared(), pthread_mutexattr_setpshared(), pthread_mutexattr_gettype(), pthread_mutexattr_settype() 関数は、該当するエラー番号を返します。
| [EINVAL] | | attr が、有効な mutex 属性オブジェクトではない場合。 |
| [EINVAL] | | pshared または type で指定された値が、正当な値ではない場合。 |
| [EINVAL] | | pshared または type で指定された値が、無効なアドレスを指している場合。 |
警告
PTHREAD_PROCESS_SHARED に確定した プロセス共有 属性で mutex を作成する場合、協調プロセスは、mutex
が割り当てられたメモリーにアクセスできなければなりません。
著者
pthread_mutexattr_setpshared() と pthread_mutexattr_getpshared() は、IEEE
POSIX P1003.1c 規格から派生しました。
pthread_mutexattr_settype() と pthread_mutexattr_gettype() は、X/Open
で開発されました。
標準準拠
pthread_mutexattr_setpshared(): POSIX 1003.1c.
pthread_mutexattr_getpshared(): POSIX 1003.1c.
pthread_mutexattr_settype(): X/Open.
pthread_mutexattr_gettype(): X/Open.