System.SyncObjs.TLightweightMREW
Delphi
TLightweightMREW = record
C++
struct DECLSPEC_DRECORD TLightweightMREW
{
private:
_RTL_SRWLOCK FNativeRW;
public:
TLightweightMREW() { _op_Initialize(*this); }
static void __fastcall _op_Initialize(/* out */ TLightweightMREW &Dest);
void __fastcall BeginRead();
bool __fastcall TryBeginRead();
void __fastcall EndRead();
void __fastcall BeginWrite();
bool __fastcall TryBeginWrite();
void __fastcall EndWrite();
};
目次
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
record struct |
public | System.SyncObjs.pas System.SyncObjs.hpp |
System.SyncObjs | System.SyncObjs |
TLightweightMREW レコード
TLightweightMREW は、RAD Studio 10.4.1 で導入された読み書きロックの実装で、すべてのサポート プラットフォームにわたって動作し、既存の TMultiReadExclusiveWriteSynchronizer より高速そして軽量です。
このシンクロナイザは、マネージド レコードとして実装されています(クラスとしてではなく。このため、メモリから解放する必要はありません)。ネイティブ POSIX API をラッピングしているため、必要とするメモリはより少なくなり、概して高速になっています。
TLightweightMREW は TMultiReadExclusiveWriteSynchronizer より大きく速度も向上しており、また、TMultiReadExclusiveWriteSynchronizer が非 Windows プラットフォーム上のクリティカル セクションとして実装されているのに対し、TLightweightMREW は、すべてのプラットフォーム上で機能する読み書きロック メカニズムとして実装されています。このため多くのケースで TLightweightMREW は、従来の TMultiReadExclusiveWriteSynchronizer のより良い代替となるでしょう。
TLightweightMREW のアクセス モード
TLightweightMREWは、読み書きロック(もしくは、MRSW ロック、MREW ロック)のネイティブ実装をラッピングしています。 このメカニズムでは、次の 2 つのアクセス「モード」が利用可能です: 共有読み込みアクセス、排他的書き込みアクセス。
共有アクセス
- 共有アクセスでは、複数のリーダーが、同時にリソースにアクセスすることができます。このとき、他のスレッドによる排他的(書き込み)アクセスの取得は抑制されます。
- 共有アクセスは、再帰的に要求される可能性があります。1 つのスレッドは、1 つの行で、複数回アクセスを取得することができます。各 BeginRead/TryBeginRead の呼び出しは、EndRead への呼び出しと対になっていなければなりません。
排他的アクセス
- 排他的(書き込み)アクセスは、一度に 1 つのスレッドに対してのみ許可されます。TLighweightMREW ロックが排他的モードである間は、他のスレッドによる共有(読み込み)アクセスの取得が抑制されます。
- 排他的アクセスは、再帰的に要求できません。
- 共有アクセスは、排他的アクセスにアップグレードすることはできません。
サポート プラットフォーム間での TLightweightMREW の利用
TLightweightMREW の実装はオペレーティング システムによって変わりますが、ロック関数などは、すべてのサポート プラットフォーム上で同じです。
次のような事象は、すべての実装で維持されています:
- いずれかのスレッドが読み込みロックを保有している場合、書き込みロックを誰も取得しない限り、他のスレッドも読み書きロックは取得できます。
- いずれかのスレッドが書き込みロックを保有すると、他のスレッドは読み込みロックも、書き込みロックも取得することはできなくなります。
- あるスレッドが読み込みロックを保有している場合、最初の読み込みロックを解放する前に、別の読み込みロックを再び取得することができます(再帰的取得)。
- あるスレッドが書き込みロックを保有している場合、別の書き込みロックを取得することはできません。
次の動作は、オペレーティング システムによって変わります:
- 少なくとも 1 つリーダーが常にアクティブで場合、ライターはロックをずっと取得できない場合があります(飢餓状況)。
- 同じスレッドが再帰的に書き込みロックを 2 回取得しようとすると、アプリケーションは、Windows では デッドロックとなりますが、POSIX システムでは例外を発生させます。