4.3. mutex オプション
手順4.1 標準のミューテックス作成
相互除外 (mutex) アルゴリズムは、共通のリソースを使用するプロセスを同時に防ぎます。高速ユーザー空間ミューテックス (futex) は、mutex が別のスレッドによって保持されていない場合に、ユーザー空間スレッドがカーネル領域にコンテキストスイッチを必要とせずに mutex を要求することを可能にするツールです。
注記
本書では、POSIX スレッド (pthread) mutex コンストラクトを記述するために、futex と mutex という用語を使用します。
- 標準属性を使用して pthread_mutex_t オブジェクトを初期化すると、プライベート、非再帰、非堅牢、非優先度継承対応のミューテックスが作成されます。
- pthreads の下で、ミューテックスは以下の文字列で初期化できます。
pthread_mutex_t my_mutex; pthread_mutex_init(&my_mutex, NULL); - この場合、アプリケーションは pthreads API および Red Hat Enterprise Linux for Real Time カーネルが提供する利点はありません。アプリケーションの書き込みまたはポート時に考慮する必要のある mutex オプションは複数あります。
手順4.2 高度なミューテックスオプション
ミューテックスの追加機能を定義するには、pthread_mutexattr_t オブジェクトを作成する必要があります。このオブジェクトは、futex の定義済み属性を保存します。
重要
この例では、関数の戻り値の確認は含まれません。これは基本的な安全手順で、常に実行する必要があります。
- mutex オブジェクトを作成します。
pthread_mutex_t my_mutex; pthread_mutexattr_t my_mutex_attr; pthread_mutexattr_init(&my_mutex_attr); - 共有およびプライベートのミューテックス:共有ミューテックスはプロセス間で使用できますが、オーバーヘッドを大きくすることができます。
pthread_mutexattr_setpshared(&my_mutex_attr, PTHREAD_PROCESS_SHARED); - リアルタイム優先度の継承:優先度の反転の問題は、優先度継承を使用して回避できます。
pthread_mutexattr_setprotocol(&my_mutex_attr, PTHREAD_PRIO_INHERIT); - 強固なミューテックス:所有者の終了時には堅牢なミューテックがリリースされますが、オーバーヘッドのコストも高くなる場合があります。この文字列の _NP は、このオプションが POSIX 非準拠または移植可能ではないことを示します。
pthread_mutexattr_setrobust_np(&my_mutex_attr, PTHREAD_MUTEX_ROBUST_NP); - mutex の初期化:属性が設定されたら、これらのプロパティーを使用して mutex を初期化します。
pthread_mutex_init(&my_mutex, &my_mutex_attr); - attributes オブジェクトをクリーンアップします。mutex を作成したら、属性オブジェクトを保持して同じタイプのミューテックスを初期化したり、クリーンアップしたりできます。ミューテックスはいずれの場合も影響を受けません。属性オブジェクトをクリーンアップするには、_destroy コマンドを使用します。
pthread_mutexattr_destroy(&my_mutex_attr);ミューテックスは、通常の pthread_mutex として動作するようになり、通常どおりロック、ロック解除、破棄できるようになります。
関連する man ページ
詳細は、以下の man ページは本セクションに記載の情報に関連しています。
- futex(7)
- pthread_mutex_destroy(P)pthread_mutex_t と pthread_mutex_init の詳細は、
- pthread_mutexattr_setprotocol(3p)pthread_mutexattr_setprotocol と pthread_mutexattr_getprotocol の詳細は、
- pthread_mutexattr_setprioceiling(3p)pthread_mutexattr_setprioceiling と pthread_mutexattr_getprioceiling の詳細は、