マルチスレッド: MFC 同期クラスの使い分け
MFC で用意されているマルチスレッド クラスは、同期オブジェクト (CSyncObject、CSemaphore、CMutex、CCriticalSection、および CEvent) と同期アクセス オブジェクト (CMultiLock および CSingleLock) という 2 つのカテゴリに分類されます。
同期クラスは、リソースの整合性を確保するためにリソースへのアクセスを制御する必要がある場合に使用されます。 同期アクセス クラスは、これらの制御されたリソースへのアクセスを取得するために使用されます。 このトピックでは、各クラスを使用する状況について説明します。
どの同期クラスを使用するかを決定するには、次の一連の質問に回答してください。
アプリケーションは、リソースにアクセスする前に何らかの処理が行われるのを待機する必要がありますか (たとえば、ファイルに書き込む前に通信ポートからデータを受信する必要がある場合など)。
「はい」の場合は、
CEvent
を使用します。同じアプリケーション内の複数のスレッドが、一度にこのリソースにアクセスする可能性がありますか (たとえば、アプリケーションで、同じドキュメントにビューを持つウィンドウを最大 5 つまで使用できる場合など)。
「はい」の場合は、
CSemaphore
を使用します。複数のアプリケーションがこのリソースを使用する可能性がありますか (たとえば、リソースが 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 のマルチスレッド」を参照してください。