4D v16.3Semaphore |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
Semaphore
Semaphore
セマフォは、ワークステーション間、または同一ワークステーション上のプロセス間で共有されるフラグです。セマフォは、単に存在したり存在しなかったりするだけです。各ユーザが実行して いるメソッドでセマフォの存在を調べることができます。セマフォは、クライアントのワークステーション、あるいはそれを作成したプロセスからのみ削除する事ができます。セマフォを作成する、またはその存在の有無を調べることにより、ワークステーション間でのメソッドの通信が可能になります。セマフォはレコードのアクセスの保護目的には使用しません。これは4Dと4D Serverが自動的に行います。セマフォは、複数のユーザが同じ処理を同時に実行するのを防ぐために用います。 Semaphore 関数はすでにセマフォが存在する場合TRUEを返し、何も行いません。セマフォが存在しない場合、Semaphore はセマフォを作成しFALSEを返します。同時に1人のユーザしかセマフォを作成することはできません。SemaphoreがFALSEを返すということは、セマフォが存在しなかったことを意味すると同時に、コマンド呼び出したプロセスに対して新たにセマフォ設定されたことを意味します。Semaphoreは、セマフォが設定されていなければFALSEを返します。またコマンドを呼び出したプロセスが既にそのセマフォを設定している場合もFALSEを返します。 セマフォは先頭の$を含めて255文字以内に制限されています。これより長い文字列を指定すると、切り捨てられた文字列を使ってセマフォがテストされます。4Dではセマフォ名は大文字/小文字を区別するという事に注意して下さい(例えば、プログラムは"MySemaphore" と "mysemaphore"は異なるものであると認識します)。 オプションの引数tickCount は、semaphore が既にセットされている時の待ち時間 (tick) を設定します。 4Dには2種類のセマフォ、ローカルセマフォとグローバルセマフォがあります。
グローバルセマフォとローカルセマフォは理論的には同じものです。違いはその有効範囲にあります。 クライアント/サーバーモードでは、グローバルセマフォはすべてのクライアントおよびサーバーで実行しているすべてのプロセス間で共用されます。ローカルセマフォは、それが作成されたマシン上で実行しているプロセス間でのみ共用されます。 スタンドアロンモードの4Dでは、ユーザは一人だけなため、グローバルセマフォもローカルセマフォもその有効範囲は同じです。ただし、シングルとマルチの両方の形でデータベースを使用する場合は、用途によってグローバルセマフォとローカルセマフォを使い分けてください。 注: インターフェースやインタープロセス変数など、クライアントアプリケーションのローカルな状態を管理するためにセマフォを使用する場合、ローカルセマフォ を利用することをお勧めします。このようなケースでグローバルセマフォを使用すると、不必要なネットーワークアクセスが行われるだけでなく、不必要に他の クライアントに影響を与えてしまいます。ローカルセマフォを使用すればこのような望ましくない副作用を避けることができます。 セマフォを使用した典型的なコードを考えてみます: While(Semaphore("MySemaphore";300)) 以下の例では、2人のユーザがProducts テーブルの価格を更新するのを防ぎます。以下のメソッドではセマフォを用いて、これを実現しています: If(Semaphore("UpdatePrices")) ` セマフォの作成を試行 以下の例はローカルセマフォを使用します。複数のプロセスを持つデータベースで、To Doリストを管理する必要があるとします。このリストはテーブルではなく、インタープロセス配列で管理します。セマフォを使って同時にアクセスされるのを防ぎます。このような場合に、To Doリストは自分だけのものなため、ローカルセマフォで十分です。 インタープロセス配列はOn Startup データベースメソッドで初期化します: ARRAY TEXT(<>ToDoList;0) ` The To Do list is initially empty To Doリストに項目を追加するメソッドを次に示します: ` ADD TO DO LIST project method どのプロセスからも上記メソッドを呼び出せます。 以下のメソッドは、セマフォーが存在する場合コードを実行せず、呼び出し元メソッドにエラーコードとテキストメッセージを返します。 シンタックス: $L_Error:=Semaphore_proof(->$T_Text_error) // セマフォーを使用した保護構造
参照
|
プロパティ
プロダクト: 4D 履歴
変更: 4D v11 SQL ARTICLE USAGE
ランゲージリファレンス ( 4D v16) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||