「ミューテックス」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
8行目:
一般的には異なるタスク間で排他制御を行いたい時に使用するが、[[マルチタスク]]環境ではプロセスの多重起動を防止する用途にも使える。
 
ミューテックスの起源は[[ディジタル・イクイップメント・コーポレーション]]における、機材の使用管理が由来である。使用可能な機材の上には小さな旗が置かれ、その旗を手にいれた者がその機材の使用権利を獲得する。この排他制御からヒントを得たVMS開発チームはVMSの排他制御にミューテックスを実現した。そしてその技術は[[デヴィッド・カトラー]]を筆頭としたVMS開発チームと共に[[Microsoft Windows NT]]にも移された(著:戦うプログラマー{{Full|date=2019年3月}}より)。
 
[[POSIX]]のmutexは、VMSやWin32と違い、自らP操作したmutexをさらにP操作するとデッドロックを起こす(そして誰もロックを解除できなくなる)。そのため若干取り扱いは不便である。再帰ロックを許可する場合は、ミューテックスの初期化時に<code>PTHREAD_MUTEX_RECURSIVE</code>を設定した属性を使用する必要がある。
 
ミューテックスを実現する方法は様々あり、大きくハードウェアによる方式とソフトウェアによる方式に分けられる。ソフトウェアによる方式にも、様々な[[アルゴリズム]]が提案されている。詳しくは、[[排他制御#排他制御の実施|排他制御の実施]]を参照。
37行目:
プロセス間の排他制御には、以下の方法がある。
* Mutex - ミューテックスオブジェクトを使う。初期化には<code>CreateMutex()</code>[[Win32 API]]関数を使う。
* Metered Section - Critical Sectionの拡張であり、<code>CreateMeteredSection()</code>関数の実装例が[[MSDN]]に記載されている。Mutexより高速であるとされている<ref>[https://web.archive.org/web/20170802104326/https://msdn.microsoft.com/ja-jp/library/cc429052.aspx 短時間でできる汎用の同期オブジェクト | MSDN], [[Internet Archive]]</ref>。[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndllpro/html/msdn_metrsect.asp]{{リンク切れ|date=2017年5月}}[http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndllpro/htm/metrsect.asp]{{リンク切れ|date=2017年5月}}
 
==== プロセス内(スレッド間)の場合 ====
50行目:
<code>System.Threading.Mutex</code>クラスを使う。
==== プロセス内(スレッド間)の場合 ====
<code>System.Threading.Monitor</code>クラスが用意されているが、このクラスを使用した言語組み込みの同期機能も用意されている。例えば[[C Sharp|C#]]では <code>lock</code> ステートメント、[[Microsoft Visual Basic .NET|Visual Basic .NET]]では <code>SyncLock</code> ステートメントで、クリティカルセクションを任意のロックオブジェクトにより相互排他ロックすることが可能である。ただし、<code>this</code>オブジェクトや<code>System.Type</code>インスタンスなど、ロックに使用してはいけないとされているオブジェクトもある<ref>[https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/lock-statement lock ステートメント - C# リファレンス | Microsoft Docs]</ref>。また、インスタンスメソッド全体を包含する場合は、<code>[MethodImplAttribute(MethodImplOptions.Synchronized)]</code>属性を適用することができる(Javaのsynchronizedメソッドに相当)。ただしC# 5.0/VB.NET 11で追加されたawait/Await演算子を含むコードブロックをlock/SyncLockでロックすることはできず、<code>System.Threading.SemaphoreSlim</code>クラスなどを使用する必要がある。
 
[[C++/CLI]]向けには[[RAII]]を応用した<code>msclr::lock</code>クラスが用意されている<ref>[https://docs.microsoft.com/ja-jp/cpp/dotnet/lock-class lock クラス | Microsoft Docs]</ref>。
 
===Java===
[[Java]]にはミューテックスクラスが存在せず、パーミッション数1で初期化した{{Javadoc:SE|name=java.util.concurrent.Semaphore|java/util/concurrent|Semaphore}}クラスで代用する。また、スレッドの同期機構が言語仕様に組み込んであり、<code>synchronized</code>ブロックにて任意のオブジェクトをロックオブジェクト(ミューテックス)として使用できる。<code>synchronized</code>メソッドでは<code>this</code>オブジェクトもしくは{{Javadoc:SE|name=java.lang.Class|java/lang|Class}}がロックに使われる。プロセス間で使用可能なミューテックスは直接サポートされておらず、ファイルロック ({{Javadoc:SE|name=java.nio.channels.FileChannel|java/nio/channels|FileChannel}}, {{Javadoc:SE|name=java.nio.channels.FileLock|java/nio/channels|FileLock}}) を利用する必要がある。
{{更新|section=1|date=2017年5月}}
[[Java]]にはミューテックスクラスが存在せず、パーミッション数1で初期化した{{Javadoc:SE|name=java.util.concurrent.Semaphore|java/util/concurrent|Semaphore}}クラスで代用する。また、スレッドの同期機構が言語仕様に組み込んであり、<code>synchronized</code>ブロックにて任意のオブジェクトをロックオブジェクト(ミューテックス)として使用できる。<code>synchronized</code>メソッドでは<code>this</code>オブジェクトもしくは{{Javadoc:SE|name=java.lang.Class|java/lang|Class}}がロックに使われる。プロセス間で使用可能なミューテックスは直接サポートされておらず、ファイルロックを利用する必要がある。
 
===μITRON仕様===