マルチスレッド環境での情報共有

Deeplからの自動翻訳

4D v16 R6では、プロセス間通信の新しいコンセプトとして、共有 オブジェクトと 共有 コレクション変数が導入されました!これは、プロセス間変数(マルチスレッドモードでは使用不可)の使用を回避するためのソリューション です。このおかげで、プリエンプティブなプロセス間で簡単に情報を共有することができるようになります。

データベースの例

新しい概念:共有オブジェクト/コレクション

コンピュータ・プログラミングの世界では、パフォーマンスが必要な場合、データの共有を少なくすればするほど、効率が良くなります。しかし、もちろん、ほとんどの場合、作成したプロセスは一緒に通信する必要があります。パラメータを送るため、結果を得るため、あるいは単に共有情報にアクセスするためです。これが、共有オブジェクトと 共有コレクションが作られた理由です。(通常のオブジェクトやコレクションはプロセス間で共有できないことを忘れないでください。それらがパラメータとして渡されると、オブジェクトのコピーが作成されます)。

共有オブジェクトと 共有コレクションは標準的なものと同じように動作しますが、インスタンス化の際に以下の新しいコマンドで「共有」と宣言する必要がある点が異なります。新規共有オブジェクトと 新規共有コレクション一度インスタンス化されると、他のオブジェクトと同じように、直接 読み出しに使用することができます。セマフォも何も必要なく、ただ共有オブジェクトを使えばいいのです。

書き込みや変更には、共有オブジェクトをUseと End useキーワードで囲む必要があります。これらのキーワードは内部セマフォを設定し、Writeモードでオブジェクトやコレクションの内容にアクセスするために採用されなければなりません。これらのキーワードの使い方は実に簡単で、4D言語のセマフォよりずっと簡単です。どうしてか?解放するのを忘れてはいけないのです。Useと End useは常に変数を囲んでいるので、ロックを解放するのを忘れることはありません。

$object:=New shared object
$ps:=New process("my process";0; "myprocess";$object) // 参照として送られる
Use ($object)
$object .myAttribute:=10
End use

他のプロセスで使うには?

と疑問に思うかもしれません。他のプロセスから (パラメータを送る以外の方法で) 共有オブジェクトを使うにはどうしたらいいのか? プロセス間変数を使わずに共有するには?

スーパー共有 “オブジェクトがこれを解決します。新しいコマンドであるStorageは実行中のすべてのプロセスに対して、このオブジェクトへのアクセスを提供します。

このオブジェクトは各マシンで一意です。シングルユーザーモードでは)1つ、それ以外はクライアントと サーバーに1つずつです。Storageコマンドは共有オブジェクトを返すので、他の共有オブジェクトと同様に操作することができますが、共有オブジェクトまたは共有コレクションしか格納することができません。(コンポーネントは自分自身のStorageも保持できることに注意してください)。

Use (Storage) .myCollection:=
StorageNew shared collection
End use

利点

共有オブジェクトと 共有コレクションは、標準的なプロセス間変数と比較して、以下のような多くの利点があります。

  • 読み出し時の保護が不要:高速アクセス
  • Use キーワードと End Use キーワードにより、デッドロックの原因となるコーディング エラーを回避できます。
  • オブジェクトや コレクションは通常、階層的(他のオブジェクトやコレクションを含む)であるため、オブジェクトをロックすることでチェーン全体を一度にロックし、パフォーマンスを向上させることができます。

共有オブジェクトやコレクションはすぐに慣れ、自然な形でプログラミングができるようになるでしょう:-)

Roland Lannuzel
- プロダクトオーナー&4Dエキスパート -電子工学を学んだ後、産業用ITの分野で開発者兼コンサルタントとして、さまざまなデータベースやテクノロジーを使って顧客のためのソリューションを構築。80年代後半に4Dに惚れ込み、会計、請求書作成、メールシステムなどのビジネスアプリケーションの作成に4Dを使用してきました。現在も、新機能やデータベース開発ツールの定義など、4Dの未来を積極的に切り開いています。