Share via


マルチタスクを使用する場合

マルチタスクを実装するには、複数のスレッドを含む 1 つのプロセスとして、または複数のプロセスとして、それぞれ 1 つ以上のスレッドを使用する 2 つの方法があります。 アプリケーションは、プライベート アドレス空間とプライベート リソースを必要とする各スレッドを独自のプロセスに配置して、他のプロセス スレッドのアクティビティから保護できます。

マルチスレッド プロセスでは、ユーザー インターフェイスの提供やバックグラウンド計算の実行など、スレッドを使用して相互に排他的なタスクを管理できます。 マルチスレッド プロセスの作成は、類似したタスクまたは同一のタスクを同時に実行するプログラムを構成する便利な方法でもあります。 たとえば、名前付きパイプ サーバーは、パイプに接続するクライアント プロセスごとにスレッドを作成できます。 このスレッドは、サーバーとクライアント間の通信を管理します。 プロセスでは、複数のスレッドを使用して、次のタスクを実行できます。

  • 複数のウィンドウの入力を管理します。
  • 複数の通信デバイスからの入力を管理します。
  • 優先順位が異なるタスクを区別します。 たとえば、高優先度のスレッドでタイム クリティカルなタスクを管理し、低優先度のスレッドで他のタスクを実行します。
  • ユーザー インターフェイスの応答性を維持しながら、バックグラウンド タスクに時間を割り当てることができます。

通常、アプリケーションでは、複数のプロセスを作成するのではなく、単一のマルチスレッド プロセスを作成してマルチタスクを実装する方が、次の理由により効率的です。

  • プロセスはスレッドよりもオーバーヘッドが多いため(プロセスコンテキストはスレッドコンテキストよりも大きいため)、システムはスレッドに対してコンテキスト切り替えを迅速に実行できます。
  • プロセスのすべてのスレッドは同じアドレス空間を共有し、プロセスのグローバル変数にアクセスできるため、スレッド間の通信を簡略化できます。
  • プロセスのすべてのスレッドは、ファイルやパイプなどのリソースに対して開いているハンドルを共有できます。

マルチスレッドの代わりに使用できる他の手法があります。 最も重要なのは、非同期入出力 (I/O)、I/O 完了ポート、非同期プロシージャ呼び出し (APC)、および複数のイベントを待機する機能です。

1 つのスレッドで、非同期 I/O を使用して同時に実行できる、時間のかかる複数の I/O 要求を開始できます。 非同期 I/O は、ファイル、パイプ、シリアル通信デバイスで実行できます。 詳細については、「 同期と重複入力と出力」を参照してください。

1 つのスレッドは、複数のイベントの 1 つまたはすべてを待機している間に、独自の実行をブロックできます。 これは、複数のスレッドを使用するよりも効率的で、それぞれが 1 つのイベントを待機し、イベントの発生を継続的にチェックすることでプロセッサ時間を消費する 1 つのスレッドを使用するよりも効率的です。 詳細については、「 待機関数」を参照してください。