10.4.1では、品質向上に重点を置いたリリースですが、いくつかの新機能が含まれており、それらの多くは、今まで未解決だった問題を解決する目的のために追加された機能です。
そのシナリオの1つに、RTL同期オブジェクトの改善があり、特にモバイルアプリケーションでTMultiReadExclusiveWriteSynchronizer(別名 TMREWSync)を使用する際の問題に対処しています。ただしWindows OSが提供するものと同等の機能が不足していたため、TMREWSyncクラスは他のプラットフォームへの実装が制限されていました。
Table of Contents
新しいTLightweightMREW レコード
10.4.1では、すべてのサポート プラットフォームにわたって動作することを目的として、古いTMREWSyncクラスより高速で軽量な、新しい読み書きロックの実装が導入されました。TLightweightMREW は、各プラットフォームにおける読み書きロックのネイティブなPOSIX APIをラッピングしているため、最良の代替手段の一つと言えます。
さらにこの新しいレコードは、レコードの作成や解放の必要性を減らすため、管理レコードとして実装されております。
TLightweightMREWレコード型は、System.SyncObjsユニットの一部で、読み書きロック(MRSWロックまたはMREWロックとしても知られています)のネイティブ実装をラップしています。スレッドはTLightweightMREWを使用して、頻繁に読み取るけれどほとんど書き込まないリソースへのアクセスを同期させることができます。
読み取り/書き込みロックは、2種類のアクセスを提供します。 共有(読み取り)アクセスを使用すると、複数のリーダーが同時にリソースへアクセスでき、スレッドが排他的(書き込み)アクセスを取得するのを防ぎます。 排他的(書き込み)アクセスでは、1つのライターのみがリソースにアクセスでき、すべてのリーダーもブロックされます。
共有読み取りアクセス
- 共有アクセスでは、複数のリーダーが同時にリソースにアクセスできるようになりますが、どのスレッドも排他的な(書き込み)アクセスを取得することができません。
- 共有アクセスは再帰的に要求することができ、1つのスレッドが連続して複数回取得することができます。BeginRead / TryBeginReadの各呼び出しは、EndReadの呼び出しとペアにする必要があります。
排他的な書き込みアクセス
- 排他的(書き込み)アクセスは、一度に1つのスレッドにのみ許可されます。TLighweightMREW ロックが排他的モードにある間は、どのスレッドも共有(読み込み)アクセスを取得することができません。
- 排他的アクセスを再帰的に要求することはできません。
- 共有アクセスから排他的アクセスへ昇格することはできません。
プラットフォームによる動作の違い
TLightweightMREWの実装はオペレーティングシステムに依存しており、ロック機能は、サポートされているすべてのプラットフォームで同じ実装です。以下の項目は、すべてのプラットホームで共通の動作です。
- スレッドが読み取りロックを保持している場合、他のスレッドも読み取りロックを取得できますが、書き込みロックは取得できません。
- スレッドが書き込みロックを保持している場合、どのスレッドも読み取りロックも書き込みロックも取得できません。
- スレッドが読み取りロックを保持している場合、最初の読み取りロックが解放される(再帰)前に、スレッドは別の読み取りロックを再度取得できます。
- スレッドが書き込みロックを保持している場合、別の書き込みロックを取得できません
以下の項目は、プラットホーム(OS)によって異なる動作です。
- 少なくとも1つの読み取りが常にアクティブである場合、書き込みはロックを取得できない場合があります(starvation状態)
- 同じスレッドが書き込みロックを再帰的に2回取得しようとすると、アプリケーションはWindowsではデッドロックになりますが、POSIXシステムでは例外が発生します。
docwikiに記載されているTLightweightMREWクラスのリファレンス情報は、以下の通りです。
(現時点では、英語版のドキュメントのみTLightweightMREWクラスに関する説明が記載されています。)
まとめ
10.4.1 は、品質向上に重点を置いた非常に注目すべきリリースで、500 以上のお客様から報告された問題が解決されていることに加え、新しい TLightweightMREW レコードのような新機能も追加されています。さらに10.4.1では、10.4 で導入された新しい LSP ベースの Delphi Code Insight の実装が大幅に改善されています。詳しくはこちらを参照ください。