次の方法で共有


マルチスレッド: MFC 同期クラスの使い分け

MFC で用意されているマルチスレッド クラスは、同期オブジェクト (CSyncObjectCSemaphoreCMutexCCriticalSection、および CEvent) と同期アクセス オブジェクト (CMultiLock および CSingleLock) という 2 つのカテゴリに分類されます。

同期クラスは、リソースの整合性を確保するためにリソースへのアクセスを制御する必要がある場合に使用されます。 同期アクセス クラスは、これらの制御されたリソースへのアクセスを取得するために使用されます。 このトピックでは、各クラスを使用する状況について説明します。

どの同期クラスを使用するかを決定するには、次の一連の質問に回答してください。

  1. アプリケーションは、リソースにアクセスする前に何らかの処理が行われるのを待機する必要がありますか (たとえば、ファイルに書き込む前に通信ポートからデータを受信する必要がある場合など)。

    「はい」の場合は、CEvent を使用します。

  2. 同じアプリケーション内の複数のスレッドが、一度にこのリソースにアクセスする可能性がありますか (たとえば、アプリケーションで、同じドキュメントにビューを持つウィンドウを最大 5 つまで使用できる場合など)。

    「はい」の場合は、CSemaphore を使用します。

  3. 複数のアプリケーションがこのリソースを使用する可能性がありますか (たとえば、リソースが DLL 内にある場合など)。

    「はい」の場合は、CMutex を使用します。

    「いいえ」の場合は、CCriticalSection を使用します。

CSyncObject が直接使用されることはありません。 これは、他の 4 つの同期クラスの基本クラスです。

例 1: 3 つの同期クラスを使用する

たとえば、アカウントのリンク リストを保持するアプリケーションの場合を考えます。 このアプリケーションでは 3 つまでのアカウントを個別のウィンドウで調べることができます。ただし、一度に更新できるアカウントは 1 つだけとします。 更新されたデータはネットワークを通じてデータ アーカイブに送られます。

このアプリケーションでは、3 種類の同期クラスをすべて使います。 同時に調べることができるアカウントは 3 つまでであるため、CSemaphore を使って 3 つのビュー オブジェクトのみにアクセスを制限します。 4 番目のアカウントを表示しようとすると、アプリケーションは最初の 3 つのウィンドウのいずれかが閉じるのを待つか、失敗します。 アカウントを更新する場合、アプリケーションは CCriticalSection を使って一度に 1 つのアカウントのみを更新します。 更新に成功すると、CEvent を発行し、このイベントの発行を待っていたスレッドを解放します。 新しいデータは、このスレッドからデータ アーカイブに送られます。

例 2: 同期アクセス クラスを使用する

使用する同期アクセス クラスの選択は、さらに簡単になります。 アプリケーションが 1 つの制御されたリソースにのみアクセスする場合は、CSingleLock を使用します。 制御された複数のリソースのいずれかにアクセスする必要がある場合は、CMultiLock を使用します。 例 1 では、CSingleLock が使用されています。これは、各ケースで、特定の時間に必要になるリソースが 1 つのみであるからです。

同期クラスの使用方法の詳細については、「マルチスレッド: 同期クラスの使用法」を参照してください。 同期の詳細については、Windows SDK の「同期」を参照してください。 MFC によるマルチスレッドのサポートの詳細は、「C++ と MFC のマルチスレッド」を参照してください。

関連項目

C++ と MFC を使用するマルチスレッド