4.3. mutex オプション
手順4.1 標準のミューテックス作成
相互除外 (mutex) アルゴリズムは、共通のリソースを使用するプロセスを同時に防ぎます。高速ユーザー空間ミューテックス (futex) は、mutex が別のスレッドによって保持されていない場合に、ユーザー空間スレッドがカーネル領域にコンテキストスイッチを必要とせずに mutex を要求することを可能にするツールです。
注記
本書では、POSIX スレッド (pthread) mutex コンストラクトを記述するために、futex と mutex という用語を使用します。
- 標準属性で
pthread_mutex_t
オブジェクトを初期化すると、プライベートで再帰的ではない不正処理および非優先度の継承 mutex が作成されます。 - pthreads の下で、ミューテックスは以下の文字列で初期化できます。
pthread_mutex_t my_mutex; pthread_mutex_init(&my_mutex, NULL);
- この場合、アプリケーションは pthreads API および Red Hat Enterprise Linux for Real Time カーネルが提供する利点はありません。アプリケーションの書き込みまたはポート時に考慮する必要のある mutex オプションは複数あります。
手順4.2 高度なミューテックスオプション
mutex の追加機能を定義するには、
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 を作成したら、属性オブジェクトを保持して同じタイプのミューテックスを初期化したり、クリーンアップしたりできます。mutex はいずれの場合も影響を受けません。属性オブジェクトをクリーンアップするには、
_destroy
コマンドを使用します。pthread_mutexattr_destroy(&my_mutex_attr);
mutex は通常の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
の詳細