Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_ЛАБ_3__15.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
126 Кб
Скачать

Cинхронизация в mfc

Библиотека MFC содержит специальные классы для синхронизации потоков (CMutex, CEvent, CCriticalSection и CSemaphore). Эти классы соответствуют объектам синхронизации WinAPI и являются производными от класса CSyncObject. Конструкторы и методы этих классов Lock и Unlock являются обертками для объектов синхронизации.

Cинхронизация в cMutex

Мьютексы полезно, если одновременно только один поток может разрешить для изменения данных или какой-либо другой контролируемому ресурсу.Например, добавление узлов к связанному списку процесс, который должен иметь разрешения только одним потоком. С помощью объекта CMutexдля управления связанного списка, одновременно только один поток может получить доступ к списку.

Чтобы использовать объект CMutex, создайте объект CMutex при необходимости. Укажите имя мьютекса необходимо дождаться on, и что приложение должно иметь его. Затем можно получить доступ мьютекс, когда конструктор завершает работу. Вызовите CSyncObject::Unlock по завершении при доступе к контролируемому ресурсу.

Альтернативный метод, чтобы использовать объекты CMutex добавление переменной типа CMutex как элемент данных, к классу необходимо отслеживать. При создании управляемого объекта, вызовите конструктор определение элемента данных CMutex если исходная принадлежит мьютекс, то именем мьютекса (если он будет использоваться через границы процессов) и пожеланных атрибутов безопасности.

Доступ к ресурсам проконтролированные объектами CMutex таким образом, сначала создать переменную или типа CSingleLock или ввести CMultiLockв функции-члене доступа данного ресурса. Затем вызовите функцию-член объекта Lock блокировки (например, CSingleLock::Lock). На этом этапе в поток или получит доступ к ресурсу, ожидание ресурсов для освобождения и доступа, увеличения или ожидает ресурс для освобождения и выдаст ошибку времени ожидания, а не сумеющ для получения доступа к ресурсу. В любом случае ресурс был доступ потокобезопасным способом.Освобождение ресурс, использование функции-члена Unlock объекта блокировки (например, CSingleLock::Unlock) или разрешить объект блокировки к падению из области.

Создает именованный или неименованный объект CMutex.

CMutex(

BOOL bInitiallyOwn = FALSE,

LPCTSTR lpszName = NULL,

LPSECURITY_ATTRIBUTES lpsaAttribute = NULL

);

Параметры

bInitiallyOwn

Определяет, если поток создания объекта CMutex исходной имеет доступ к ресурсу проконтролированному мьютексами.

lpszName

Имя объекта CMutex. Если другой мьютекс с таким же именем существует, то lpszName должен быть указан, если объект будет использоваться через границы процессов. Если NULL, мьютекс станет именованные. Если имя соответствует существующему мьютексу, конструктор создает новый объект CMutex, который ссылается на мьютекс с таким именем. Если имя соответствует существующему объекту, то синхронизации объектов взаимных исключений, конструкция, не завершится с ошибкой.

lpsaAttribute

Атрибуты безопасности для объекта мьютекса. Полное описание структуры, см. в разделе SECURITY_ATTRIBUTES в Windows SDK.

Eсть еще один способ использования этих классов - написание так называемых потоково-безопасных классов (thread-safe classes). Потоково-безопасный класс - это класс, представляющий какой либо ресурс в программе. Вся работа с ресурсом осуществляется только через этот класс, который содержит все необходимые для этого методы. Причем класс спроектирован таким образом, что его методы сами заботятся о синхронизации, так что в приложении он используется как обычный класс. Объект синхронизации MFC добавляется в этот класс в качестве закрытого члена класса, и все функции этого класса, осуществляющие доступ к ресурсу, согласуют с ним свою работу.

C классами синхронизации MFC можно работать как напрямую, используя методы Lock и Unlock, так и через промежуточные классы CSingleLock и CMultiLock (хотя на мой взгляд, работать через промежуточные классы несколько неудобно. Но использование класса СMultiLock необходимо, если вы хотите следить за состоянием сразу нескольких объектов).