第10章 RHEL for Real Time のスレッド同期メカニズム
リアルタイムでは、2 つ以上のスレッドが同時に共有リソースにアクセスする必要がある場合、スレッドはスレッド同期メカニズムを使用して調整します。スレッドの同期により、一度に 1 つのスレッドのみが共有リソースを使用するようになります。Linux で使用される 3 つのスレッド同期メカニズムは、ミューテックス、バリア、および条件変数 (condvars) です。
10.1. ミューテックス リンクのコピーリンクがクリップボードにコピーされました!
ミューテックスは、相互排除という用語に由来します。相互排除オブジェクトは、リソースへのアクセスを同期します。これは、一度に 1 つのスレッドのみがミューテックスを取得できるようにするメカニズムです。
mutex アルゴリズムは、コードの各セクションへのシリアルアクセスを作成するため、一度に 1 つのスレッドだけがコードを実行します。ミューテックスは、mutex 属性オブジェクトと呼ばれる属性オブジェクトを使用して作成されます。これは抽象オブジェクトであり、実装するために選択した POSIX オプションに依存するいくつかの属性が含まれています。属性オブジェクトは、pthread_mutex_t 変数で定義されます。オブジェクトは、ミューテックスに定義された属性を格納します。成功すると、pthread_mutex_init(&my_mutex, &my_mutex_attr) 関数、pthread_mutexattr_setrobust() 関数および pthread_mutexattr_getrobust() 関数は 0 を返します。エラーが発生すると、エラー番号が返されます。
リアルタイムでは、属性オブジェクトを保持して同じ型のミューテックスをさらに初期化するか、属性オブジェクトをクリーンアップ (破壊) することができます。ミューテックスはいずれの場合も影響を受けません。ミューテックスには、標準タイプと高度なタイプのミューテックスが含まれます。
標準ミューテックス
リアルタイム標準のミューテックスは、プライベート、非再帰的、非堅牢、非優先度継承が可能なミューテックスです。pthread_mutex_init(&my_mutex, &my_mutex_attr) を使用して pthread_mutex_t を初期化すると、標準のミューテックスが作成されます。標準のミューテックスタイプを使用する場合、アプリケーションは、pthreads API および RHEL for Real Time カーネルによって提供される利点の恩恵を受けない場合があります。
高度なミューテックス
追加機能で定義されたミューテックスは、高度なミューテックスと呼ばれます。高度な機能には、優先度継承、ミューテックスの堅牢な動作、共有およびプライベートミューテックスが含まれます。たとえば、ロバストミューテックスの場合は、pthread_mutexattr_setrobust() 関数を初期化すると、ロバスト属性が設定されます。同様に、属性 PTHREAD_PROCESS_SHARED を使用すると、スレッドが割り当てられたメモリーにアクセスできる場合に限り、任意のスレッドがミューテックスで動作できるようになります。属性 PTHREAD_PROCESS_PRIVATE は、プライベートミューテックスを設定します。
非堅牢なミューテックスは自動的に解放されず、手動で解放するまでロックされたままになります。