スレッドの問題

Windows、UNIX、および OpenVMS 上での Natural プロセスには、Natural コードを実行するスレッドが、常に 1 つのみ含まれています。したがって、対話形式で開始された Natural セッションで、Natural コードを複数のスレッドが並行して実行しようとすることはありません。複数のスレッドを並行して実行するクライアントプログラムが Natural Native Interface を使用する場合は、状況が異なります。

Natural Native Interface は、マルチスレッドアプリケーションで使用可能です。インターフェイス関数はスレッドセーフです。任意のスレッド T がインターフェイス関数の 1 つで実行中である限り、インターフェイス関数の 1 つを呼び出す同じプロセスの別のスレッドは、T がインターフェイス関数を解放するまでブロックされます。実際には、プロセスで並行して実行されるスレッドは、インターフェイス関数の使用に関する限り、シリアライズされます。異なるプロセスのスレッド間でインターフェイスアクセスをシリアライズする必要はありません。これは、NNI を使用する各プロセスごとに独自の Natural セッションが実行されるためです。

呼び出し元のアプリケーションは、NNI へのマルチスレッドアクセスも明示的に制御できます。このことは、スレッドが別のスレッドに中断されずに一連の NNI コールを実行する場合に意味があります。この処理を実現するため、スレッドは nni_enter を呼び出します。この関数を使用すると、スレッドは他のすべてのスレッドが NNI を解放するまで待機できます。その後スレッドは作業を開始し、NNI 関数を自由に呼び出します。作業が終了すると、スレッドは nni_leave を呼び出して、他のスレッドが NNI にアクセスできるようにします。

NNI を使用するマルチスレッドアプリケーションは、次のルールに従う必要があります。

  • 関数 nni_initialize および nni_uninitialize は、プロセスごとに少なくとも 1 回呼び出す必要があります。

  • 関数 nni_uninitialize は、nni_initialize への対応するコールと同じスレッドで呼び出す必要があります。

  • 関数 nni_uninitialize は、NNI を使用する最後のスレッドが終了する前に呼び出さないでください。