System.SyncObjs.TLightweightMREW
Delphi
TLightweightMREW = record
{$IFDEF MACOS}
private
class var CalendarClock: clock_serv_t;
{$ENDIF MACOS}
private
{$IFDEF MSWINDOWS}
FNativeRW: SRWLOCK;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
FNativeRW: pthread_rwlock_t;
procedure GetPosixEndTime(var EndTime: timespec; TimeOut: Cardinal); inline;
{$ENDIF POSIX}
public
{$IFDEF MACOS}
class constructor Create;
class destructor Destroy;
{$ENDIF MACOS}
[HPPGEN('TLightweightMREW() { _op_Initialize(*this); }' + #13#10#13#10#9 +
'static void __fastcall _op_Initialize(/* out */ TLightweightMREW &Dest)')]
class operator Initialize(out Dest: TLightweightMREW);
procedure BeginRead;
function TryBeginRead: Boolean; {$IF defined(LINUX) or defined(ANDROID)}overload;{$ENDIF}
{$IF defined(LINUX) or defined(ANDROID)}
function TryBeginRead(Timeout: Cardinal): Boolean; overload;
{$ENDIF LINUX or ANDROID}
procedure EndRead;
procedure BeginWrite;
function TryBeginWrite: Boolean; {$IF defined(LINUX) or defined(ANDROID)}overload;{$ENDIF}
{$IF defined(LINUX) or defined(ANDROID)}
function TryBeginWrite(Timeout: Cardinal): Boolean; overload;
{$ENDIF LINUX or ANDROID}
procedure EndWrite;
end;
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 システムでは例外を発生させます。