ミューテックスミューテックス (英: mutex) とは、コンピュータプログラミングにおける技術用語。クリティカルセクションでアトミック性を確保するための排他制御や同期機構の一種である。「mutex」という語は「mutual exclusion」 (相互排他、排他制御) の省略形である。ここでは、狭義の排他制御について述べる。 概要セマフォをクリティカルセクションの排他制御に用いる時、セマフォでは(初期値が1でなければ)複数のタスクがクリティカルセクションに入ることを許可するのに対し、ミューテックスでは同時に一つのタスクのみがクリティカルセクションに入ることを許可する(ここで言うタスクとは、スレッドまたはプロセスを指す)。挙動はセマフォ変数の初期値を1にする事と等価。このようなタスク優先度とリンクしないミューテックスを、バイナリセマフォと呼ぶ場合もある。 狭義には、ミューテックスの場合にそれをロック(P操作)したタスクのみがアンロック(V操作)できるのに対して、セマフォではその様な制約はない。また、ミューテックスには、優先度逆転を防止するための優先度継承 (Priority Inheritance) 機能や、デッドロックを防止するための優先度上限プロトコル (Priority Ceiling Protocol) 機能などが拡張されていることがある。 一般的には異なるタスク間で排他制御を行いたい時に使用するが、マルチタスク環境ではプロセスの多重起動を防止する用途にも使える。 ミューテックスの起源はディジタル・イクイップメント・コーポレーションにおける、機材の使用管理が由来である。使用可能な機材の上には小さな旗が置かれ、その旗を手にいれた者がその機材の使用権利を獲得する[1]。この排他制御からヒントを得たVMS開発チームはVMSの排他制御にミューテックスを実現した。そしてその技術はデヴィッド・カトラーを筆頭としたVMS開発チームと共にMicrosoft Windows NTにも移された(著:戦うプログラマー[要文献特定詳細情報]より)。 POSIXスレッド (Pthreads) のミューテックスは、VMSやWin32と違い、自らP操作したミューテックスをさらにP操作するとデッドロックを起こす(そして誰もロックを解除できなくなる)。そのため若干取り扱いは不便である。再帰ロックを許可する場合は、ミューテックスの初期化時に ミューテックスを実現する方法は様々あり、大きくハードウェアによる方式とソフトウェアによる方式に分けられる。ソフトウェアによる方式にも、様々なアルゴリズムが提案されている。詳しくは、排他制御の実施を参照。 ミューテックスの使用ミューテックス機構を使用するには、プログラムでミューテックスオブジェクトを作成する必要がある。ミューテックスオブジェクトはシグナルおよび非シグナルの二つの状態を持ち、それぞれミューテックスオブジェクトが所有可能および所有不可能である事を表す。 クリティカルセクションへの進入クリティカルセクションに入るにはミューテックスオブジェクトの所有を行う。所有というのはインスタンスの作成という意味ではなく、クリティカルセクションへの進入権を得るという事である。この時、ミューテックスオブジェクトの状態によってクリティカルセクションに入れるかどうかが異なる。
クリティカルセクションからの離脱クリティカルセクションから抜ける時はミューテックスオブジェクトを解放する。解放されたミューテックスオブジェクトは非シグナル状態からシグナル状態に戻り、これによって後続のタスクはミューテックスオブジェクトを所有する事が可能になる。 環境ごとの使用法POSIXプロセス間の場合Pthreadsのミューテックスオブジェクトを初期化する際に使用する属性 プロセス内(スレッド間)の場合Pthreadsのミューテックスオブジェクト Windowsプロセス間の場合プロセス間の排他制御には、以下の方法がある。
プロセス内(スレッド間)の場合プロセス間でミューテックスを共有する必要がない場合は、以下の方法がある。
MFCにはC++のコンストラクタ/デストラクタによるRAII機構を利用した、Win32同期オブジェクトのラッパークラス C++PthreadsやWin32 APIを直接使用するか、あるいは以下に述べるようなポータブルなライブラリを使用する。 プロセス間の場合Boost C++ライブラリの プロセス内(スレッド間)の場合Boost C++ライブラリの .NETプロセス間の場合
プロセス内(スレッド間)の場合
C++/CLI向けにはRAIIを応用した JavaJavaにはミューテックスクラスが存在せず、パーミッション数1で初期化した μITRON仕様3.0仕様以前には、ミューテックスは存在しない。広義のミューテックスはセマフォで代用することは可能であるが、優先度逆転を防げない。 しかしながら、3.0仕様準拠OSでも、実装独自に優先度逆転を防止できるミューテックスが存在する可能性はある。 4.0仕様以降では、優先度上限および優先度継承をサポートするミューテックスオブジェクトが追加された。しかし、スタンダードプロファイルには含まれておらず、実質オプション扱いである。 脚注
関連項目 |