Поделиться через


Многопоточность. Когда следует использовать классы синхронизации MFC

Многопоточные классы, предоставляемые MFC, делятся на две категории: объекты синхронизации (CSyncObject, CSemaphore, CMutex, CCriticalSection и CEvent) и объекты доступа к синхронизации (CMultiLock и CSingleLock).

Классы синхронизации используются при управлении доступом к ресурсу, чтобы обеспечить целостность ресурса. Классы доступа к синхронизации используются для получения доступа к этим управляемым ресурсам. В этом разделе описывается, когда следует использовать каждый класс.

Чтобы определить, какой класс синхронизации следует использовать, задайте следующий ряд вопросов:

  1. Нужно ли приложению ждать, пока он не сможет получить доступ к ресурсу (например, данные должны быть получены из порта связи, прежде чем его можно будет записать в файл)?

    Если да, используйте CEvent.

  2. Можно ли одновременно получить доступ к этому ресурсу несколькими потоками в одном приложении (например, приложение разрешает до пяти окон с представлениями в одном документе)?

    Если да, используйте CSemaphore.

  3. Может ли несколько приложений использовать этот ресурс (например, ресурс находится в библиотеке DLL)?

    Если да, используйте CMutex.

    Если нет, используйте CCriticalSection.

CSyncObject никогда не используется напрямую. Это базовый класс для других четырех классов синхронизации.

Пример 1. Использование трех классов синхронизации

Например, рассмотрим приложение, которое поддерживает связанный список учетных записей. Это приложение позволяет проверять до трех учетных записей в отдельных окнах, но только один может быть обновлен в любое время. При обновлении учетной записи обновленные данные отправляются по сети в архив данных.

В этом примере приложения используются все три типа классов синхронизации. Так как он позволяет одновременно проверять до трех учетных записей, он используется CSemaphore для ограничения доступа к трем объектам представления. При попытке просмотреть четвертую учетную запись приложение ожидает, пока одно из первых трех окон не закроется или завершится сбоем. При обновлении учетной записи приложение используется CCriticalSection для обеспечения одновременного обновления только одной учетной записи. После успешного обновления он сигнализирует CEvent, что освобождает поток, ожидающий сигнала события. Этот поток отправляет новые данные в архив данных.

Пример 2. Использование классов доступа к синхронизации

Выбор используемого класса доступа к синхронизации еще проще. Если приложение связано с доступом только к одному управляемому ресурсу, используйте CSingleLock. Если ему требуется доступ к любому из нескольких контролируемых ресурсов, используйте CMultiLock. В примере 1 было бы использовано, CSingleLock так как в каждом случае требуется только один ресурс в любое время.

Сведения о том, как используются классы синхронизации, см. в разделе "Многопоточность: использование классов синхронизации". Сведения о синхронизации см. в разделе "Синхронизация " в пакете SDK для Windows. Сведения о поддержке многопоточных операций в MFC см. в разделе "Многопоточность" с помощью C++ и MFC.

См. также

Реализация многопоточности на языке C++ с помощью классов MFC