ミューテックス
読み:ミューテックス
外語:mutex: mutual exclusion
並行して動作するプロセスなどの間で、同期をとったり、排他制御をするための機構の一つ。mutexは、Mutual Exclusion(相互排除)の省略形となる造語である。
概要
セマフォに似ているが、よりシンプルである。OSによって、セマフォしかない環境も、ミューテックスしかない環境も実在する。
実装の仕様自体も様々で一般論になるが、セマフォとミューテックスの違いは、セマフォは複数のロックが可能なのに対してミューテックスは一つのみ可能、デッドロック回避の機構がある、ロック状態でプロセス(ないしスレッド)を終了させても自動的に解放される、などの違いがある。
特徴
動作
ミューテックスは、ロック、アンロックという二つの状態を取り得る。
ロック状態とは、いずれかのスレッドに保有されている状態であり、アンロック状態とは、いずれのスレッドにも保有されていない状態をいう。
一つのミューテックスを、二つ以上のスレッドが同時に保有することはない。
この性質を用いて、ミューテックスのロックという処理を使うことでアトミックな動作を実現させる。
POSIX
POSIXスレッドのミューテックスは、主として次の二つの関数を使う。
- pthread_mutex_lock
- pthread_mutex_unlock
引数として、pthread_mutex_tを使う。
なお、pthread_mutex_lockはブロックするが、ブロックしないpthread_mutex_trylockを使うこともできる。
Linux
Linuxカーネルのミューテックスは、主として次の関数を使う。
- mutex_init
- mutex_lock
- mutex_unlock
- mutex_destroy
引数として、struct mutexを使う。
なお、mutex_lockはブロックするが、ブロックしないmutex_trylockを使うこともできる。
Windows
Windowsでは、引数にユニークな文字列を与えることでミューテックスのハンドルを得、これによってアトミックな動作を実現できる。
一般的な用例として、アプリケーションソフトウェアの多重起動を防止する例を次に掲げる。
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// グローバルなMutexの作成
HANDLE hmutex = CreateMutex(NULL, TRUE, _T("Global\\ユニークな文字列"));
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// すでに起動している
}
else
{
// まだ起動していない
}
// 使用後は必ず後始末をする
ReleaseMutex(hmutex);
CloseHandle(hmutex);
}
既に起動している場合は、そのまま終了させれば、多重起動を防止することができる。
再検索