# OS_TryLockMutexFrom[RToW|WToR]

## 構文

  `#include <nitro/os.h>`
  `BOOL OS_TryLockMutexFromRToW( OSMutex* mutex );`
  `BOOL OS_TryLockMutexFromWToR( OSMutex* mutex );`

## 引数

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

## 返り値

mutex のロックを正しく read lock から write lock へ、あるいは write lock から read lock へ移行できた場合は TRUE を、そうでない場合は FALSE を返します。

## 説明

ロックされている mutex の種類を変更します。

mutex は変更しようとしている OSMutex 構造体へのポインタです。

`OS_TryLockMutexFromWToR()` は write lock された mutex を read lock へ移行しようとします。成功すると、それ以降は read lock の性質を持ち、アンロックする場合も `OS_UnlockMutexR()` または `OS_UnlockMutexRW()` で行う必要があります。

`OS_TryLockMutexFromRToW()` は read lock された mutex を write lock へ移行します。成功すると、それ以降は write lock の性質を持ち、アンロックする場合も `OS_UnlockMutexW()` または `OS_UnlockMutexRW()` で行う必要があります。

mutex が、多段にロックされていたり、種類が正しくない場合は失敗となり、FALSE を返します。多段にロックされるというのは、複数のスレッドからロックされていたり、同じスレッドであっても同じ `OSMutex` 構造体に対し二重以上にロックの関数を呼んでいる場合です。種類が正しくないというのは、例えば、read lock から write lock に移行しようとしているのに、read lock のミューテックスではないような場合です。

> `(例1)
> OSMutex mutex;
> OS_LockMutexR( &mutex );
> OS_LockMutexR( &mutex );
> if ( OS_TryLockMutexFromRToW( &mutex ) == FALSE )← mutex が多段にロックされているので FALSE を返します。
> {
> ：
> }`

> `(例2)
> OSMutex mutex;
> OS_LockMutexR( &mutex );
> if ( OS_TryLockMutexFromWToR( &mutex ) == FALSE )← read lock なのに "FromWToR" なので FALSE を返します。
> {
> ：
> }`

成功であっても失敗であっても、本関数からはすぐに戻ります。 スレッドの切り替わりが発生することはありません。

## 参照

`OS_InitMutex, OS_LockMutex, OS_UnlockMutex
OS_LockMutexR, OS_LockMutexW, OS_UnlocMutexR, OS_UnlocMutexW
OS_TryLockMutexR, OS_TryLockMutexW
OS_LockMutexFromRToW, OS_LockMutexFromWToR
`

## 履歴

2008/12/16 初版