メモリマネージャのマルチスレッド対応 -- IsMultiThread
|
以下,
http://www.borland.co.jp/interbase/tech/ib_udf/delphi_udf_2.html
からの抜粋です。Delphi のメモリマネージャをマルチスレッドで利用する際に IsMultiThread グローバル変数を使わなければならないことを解説しています。
>>>>>>>>>>>>>>>> ここから
スレッドセーフティの問題を解決するために、Inpriseはメモリ管理ルーチンをクリティカル・セクションにラップすることによってメモリ・マネージャをスレッドセーフにしました。クリティカル・セクションについて説明することは本稿の範囲を外れているので詳しくは述べませんが、共用リソースへ秩序正しくアクセスできるようにするものであるとだけ考えておいてください。
Inpriseはその際に、クリティカル・セクションはあまりよく知られていない変数IsMultiThreadがTrueに設定されている場合しか使用されないという規則を設定しました。(IsMultiThreadは、すべてのDelphiユニットによって暗黙的に使用されるユニット 'System.pas' で定義されます。)
つまりこういうことなのです。Delphiは確かにスレッドセーフですが、それは開発者がそのように指示した場合だけです。アプリケーションやライブラリで複数のスレッドを扱う可能性がある場合は、必ずIsMultiThreadをTrueに設定しなければなりません。そうでないと、そのアプリケーションやライブラリはスレッドセーフになりません。(重要:IsMultiThreadはTThreadオブジェクトを使用した場合は暗黙的に設定されます。)
マルチスレッド環境でIsMultiThreadをTrueに設定することの必要性は、いくら強調してもしすぎることはありません。 |
|