Реализация многопоточности на языке C++ с помощью классов MFC
Библиотека Microsoft Foundation Class (MFC) предоставляет поддержку многопоточных приложений. В данном разделе описываются процессы и потоки, а также подход MFC к многопоточности.
Процесс является выполняющимся экземпляром приложения. Например, при двойном щелчке значка "Блокнот" запускается процесс, который выполняет программу Блокнот.
Поток — это ветвь выполнения внутри процесса. При запуске программы Блокнот операционная система создает процесс и начинает выполнение основного потока этого процесса. Когда поток прекращается, завершается и процесс. Этот основной поток передается операционной системе кодом запуска в форме адреса функции. Обычно предоставляется адрес функции main или WinMain.
При необходимости можно создавать дополнительные потоки. Это необходимо сделать для обработки фоновых или обслуживающих задач, если требуется, чтобы пользователь не ожидал их завершения. Все потоки в приложениях MFC представлены объектами CWinThread. В большинстве ситуаций вам даже не нужно явно создавать эти объекты; вместо этого вызовите вспомогательную функцию AfxBeginThread, которая создаст объект CWinThread.
MFC различает два типа потоков: потоки пользовательского интерфейса и рабочие потоки. Потоки пользовательского интерфейса широко используются для обработки ввода и отклика на события и сообщения, создаваемые пользователем. Рабочие потоки применяются для выполнения задач, которые не требую ввода со стороны пользователя, например пересчета. API-интерфейс Win32 не делает различия между типами потоков; ему достаточно "знать" начальный адрес потока, чтобы начать его обработку. MFC обрабатывает потоки пользовательского интерфейса, предоставляя конвейер сообщений для событий в интерфейсе. CWinApp является примером объекта потока пользовательского интерфейса, поскольку он наследуется от класса CWinThread и обрабатывает события и сообщения, создаваемые пользователем.
Особое внимание следует уделить ситуациям, когда несколько потоков пытаются получить доступ к одному и тому же объекту. В разделе Многопоточность. Советы по программированию описываются способы устранения проблем, которые могут возникнуть в подобных ситуациях. В разделе Многопоточность. Использование классов синхронизации описывается использование классов, доступных для синхронизации доступа нескольких потоков к одному объекту.
Написание и отладка многопоточной программы — довольно сложная и непредсказуемая задача, поскольку необходимо быть уверенным, что к объектам не осуществляется одновременный доступ из более чем одного потока. В разделах, посвященных многопоточности, не описываются основы многопоточного программирования, в них говорится только о том, как использовать MFC в многопоточных программах. Примеры многопоточных приложений MFC, включенные в Visual C++, демонстрируют дополнительные возможности многопоточности и API-интерфейса Win32, не включенные в MFC; однако они только предполагаются как отправные точки.
Дополнительные сведения о том, как операционная система обрабатывает процессы и потоки, см. в разделе Процессы и потоки пакета Windows SDK.
Дополнительные сведения о поддержке многопоточности MFC см. в следующих разделах: