# OS_UnlockMutex[R|W|RW]

## 構文

  `#include <nitro/os.h>`
  `void OS_UnlockMutexR( OSMutex* mutex );`
  `void OS_UnlockMutexW( OSMutex* mutex );`
  `void OS_UnlockMutexRW( OSMutex* mutex );`

## 引数

mutex | OSMutex構造体へのポインタ

## 返り値

なし。

## 説明

呼び出したスレッドはmutex を解放します。

`OS_UnlockMutexR()` は read lock をアンロックする関数です。read lock をアンロックする場合は、呼び出したスレッドが mutex の所有者でなくても構いません。ただし、この mutex が n 回ロックされていた場合、n 番目の `OS_UnlockMutexR()` でのみ実際に mutex を解放します。

`OS_UnlockMutexW()` は write lock をアンロックする関数です。write lock をアンロックする場合は、呼び出したスレッドは mutex の所有者でなければなりません。ただし、呼び出したスレッドがこの mutex を n 回ロックしていた場合、n 番目の `OS_UnlockMutexW()` でのみ実際にmutex を解放します。

`OS_UnlockMutexRW()` は read lock、write lock のどちらもアンロック出来る関数です。前述の `OS_UnlockMutexR()` と `OS_UnlockMutexW()` の両方の特性を備えています。`OS_LockMutex()` でロックされたものもアンロック可能です。

###
ロックとアンロックの対応

`OS_LockMutexR()` でロックした mutex は `OS_UnlockMutexR()` または `OS_UnlockMutexRW()` でアンロックしてください。`OS_UnlockMutexW()` でアンロックしようとすると `OS_Panic()` で停止します。

`OS_LockMutexW()` でロックした mutex は `OS_UnlockMutexW()` または `OS_UnlockMutexRW()` でアンロックしてください。`OS_UnlockMutexR()` でアンロックしようとすると `OS_Panic()` で停止します。

また、ロックされていない mutex を `OS_UnlockMutexR()`, `OS_UnlockMutexW()`, `OS_UnlockMutexRW()` でアンロックしようとすると `OS_Panic()` で停止します。

いずれも `OS_Panic()` で停止した場合はロック関数とアンロック関数の対応が取れていないということなので、アプリケーションプログラム上の不具合が考えられます。

###
スレッドの終了

mutex をロックしているスレッドが `OS_ExitThread()` によって終了したときは、そのmutex は自動的にアンロックされます。

## 参照

`OS_InitMutex, OS_LockMutex, OS_TryLockMutex, OS_ExitThread
OS_LockMutexR, OS_LockMutexW, OS_TryLockMutexR, OS_TryLockMutexW
OS_LockMutexFromRToW, OS_LockMutexFromWToR,
OS_TryLockMutexFromRToW, OS_TryLockMutexFromWToR`

## 履歴

2008/12/16 初版