マルチスレッドとアプリケーション

マルチスレッド アプリケーションとは、オペレーティング システムが提供するマルチスレッド機能を利用したアーキテクチャのアプリケーションを指します。通常、マルチスレッド アプリケーションは、プロセス内の各スレッドに特定のジョブを割り当てます。各スレッドはさまざまな方法で互いに通信し合い、それぞれのアクションの同期を取ります。たとえば、データ処理アプリケーションを設計する場合に、1 つのスレッドでグラフィカル ユーザー インターフェイスを完全に処理し、別のスレッドでそのアプリケーションの実際の作業を行います。このアーキテクチャにより、アプリケーション内の実際の作業とユーザーインターフェイスを完全に分離できます。

他には、マルチスレッド アプリケーションをクライアント/サーバー アプリケーションのサーバー側で使用する方法もあります。サーバーを設計する場合に、主コントローラー スレッドまたは通信スレッドに送信されたそれぞれのサービス要求に対して、その要求を処理し、結果をコントローラーに返す別のサービス スレッドを作成できます。このアーキテクチャにより、コントローラーはこれらの結果をクライアントに送り返します。このアーキテクチャの主な利点は、サーバーが 1 つのクライアントの要求に拘束されて他のクライアントの要求に迅速に応答できない、という事態が発生しないことです。

サーバーから応答をただちに (または高速で) 得るクライアント/サーバー アプリケーションは、従来、マルチスレッドを使用しないで作成されてきました。これは、通常、主コントローラー プロセスまたは通信プロセスが各クライアントの要求に対して、個別のサービス プロセスを作成することで実現されています。マルチスレッドがこれらのアプリケーションで必要とされる理由は何でしょう。それは、システム リソースの有効利用です。

スレッドの作成時に必要なオペレーティング システムのリソース (メモリ、コンテキスト スワップのオーバーヘッドなど) はわずかなので、ファイルや他のリソースを簡単に共有できます。一方、プロセスの作成には、より多くのシステム リソースが必要なので、プロセス間で互いに通信したり、ファイルを共有したりすることがより難しくなります。マルチスレッドを使用すると、既存のハードウェア リソースを最大限に利用し、リソースの共有を簡略化できます。

一方、マルチスレッド アプリケーションにも欠点があります。各スレッドは、同じプロセスの他のスレッドと共有する可能性のあるリソースを、認識している必要があります。プログラマは、複数のスレッドが同時に実行されることに注意してください。また、2 つのスレッドが実行同期を取らずに同じデータ項目に書き込みを行うと、そのデータ項目が破損する可能性があります。

たとえば、次に示すコードを考えます。

 
Working-Storage Section.
01 group-item.
  05 field-1  pic x.
  05 field-2  pic x.
procedure division.
move 'A' to field-1
move 'B' to field-2
display group-item
Working-Storage Section.
01 group-item.
  05 field-1  pic x.
  05 field-2  pic x.
procedure division.
move 'C' to field-2
move 'D' to field-1
display group-item

次に示すスレッドの実行順序を考えます。

処理のステップ スレッド 1 の実行 スレッド 2 の実行
1
move 'A' to field-1
 
2  
move 'C' to field-2
3
move 'B' to field-2
 
4  
move 'D' to field-1
5
display group-item
 
6  
display group-item

この例では、どちらのスレッドも予期した値を表示しません。予期していたスレッド 1 の結果は 'AB' で、スレッド 2 の結果は 'DC' です。ただし、両方のスレッドが実際に表示する値は 'DB' です。マルチスレッド アプリケーションを作成する場合は、各スレッド間で実行の同期を取り、スレッド間でデータが競合しないようにしてください。詳細については、「実行の同期と競合の解決」の章で説明します。