System.SyncObjs.TLightweightMREW

提供: RAD Studio API Documentation
移動先: 案内検索

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 をラッピングしているため、必要とするメモリはより少なくなり、概して高速になっています。

TLightweightMREWTMultiReadExclusiveWriteSynchronizer より大きく速度も向上しており、また、TMultiReadExclusiveWriteSynchronizer が非 Windows プラットフォーム上のクリティカル セクションとして実装されているのに対し、TLightweightMREW は、すべてのプラットフォーム上で機能する読み書きロック メカニズムとして実装されています。このため多くのケースで TLightweightMREW は、従来の TMultiReadExclusiveWriteSynchronizer のより良い代替となるでしょう。

TLightweightMREW のアクセス モード

TLightweightMREWは、読み書きロック(もしくは、MRSW ロック、MREW ロック)のネイティブ実装をラッピングしています。 このメカニズムでは、次の 2 つのアクセス「モード」が利用可能です: 共有読み込みアクセス、排他的書き込みアクセス。

共有アクセス

  • 共有アクセスでは、複数のリーダーが、同時にリソースにアクセスすることができます。このとき、他のスレッドによる排他的(書き込み)アクセスの取得は抑制されます。
  • 共有アクセスは、再帰的に要求される可能性があります。1 つのスレッドは、1 つの行で、複数回アクセスを取得することができます。各 BeginRead/TryBeginRead の呼び出しは、EndRead への呼び出しと対になっていなければなりません。

排他的アクセス

  • 排他的(書き込み)アクセスは、一度に 1 つのスレッドに対してのみ許可されます。TLighweightMREW ロックが排他的モードである間は、他のスレッドによる共有(読み込み)アクセスの取得が抑制されます。
  • 排他的アクセスは、再帰的に要求できません。
  • 共有アクセスは、排他的アクセスにアップグレードすることはできません。

サポート プラットフォーム間での TLightweightMREW の利用

TLightweightMREW の実装はオペレーティング システムによって変わりますが、ロック関数などは、すべてのサポート プラットフォーム上で同じです。

次のような事象は、すべての実装で維持されています:

  • いずれかのスレッドが読み込みロックを保有している場合、書き込みロックを誰も取得しない限り、他のスレッドも読み書きロックは取得できます。
  • いずれかのスレッドが書き込みロックを保有すると、他のスレッドは読み込みロックも、書き込みロックも取得することはできなくなります。
  • あるスレッドが読み込みロックを保有している場合、最初の読み込みロックを解放する前に、別の読み込みロックを再び取得することができます(再帰的取得)。
  • あるスレッドが書き込みロックを保有している場合、別の書き込みロックを取得することはできません。

次の動作は、オペレーティング システムによって変わります:

  • 少なくとも 1 つリーダーが常にアクティブで場合、ライターはロックをずっと取得できない場合があります(飢餓状況)。
  • 同じスレッドが再帰的に書き込みロックを 2 回取得しようとすると、アプリケーションは、Windows では デッドロックとなりますが、POSIX システムでは例外を発生させます。