Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ ОС ЭКЗАМЕН.docx.doc
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
185.86 Кб
Скачать

19. Синхронизация потоков. Interlocked функции. Назначение функций:

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

Функции InterlockedIncrement и InterlockedDecrement выполняют, соответственно, увеличение и уменьшение на единицу значения переменной типа LONG, адрес которой передается им в качестве единственного параметра:

LONG InterlockedIncrement(LPLONG lpAddend);

LONG InterlockedDecrement(LPLONG lpAddend);

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

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

LONG InterlockedExchange(

LPLONG lpTarget, // адрес изменяемой переменной

LONG lNewValue); // новое значение для переменной

Эта функция записывает значение lNewValue по адресу lpTarget. При этом гарантируется, что операция не будет прервана другой задачей, выполняющейся в рамках того же процесса.

Функция InterlockedExchange возвращает старое значение изменяемой переменной.

20. Синхронизация потоков. Критические секции. Функции.

Критическая секция (Critical Section) это участок кода, в котором поток (thread) получает доступ к ресурсу (например переменная), который доступен из других потоков.

Объект критическая секция обеспечивает синхронизацию. Этим объектом может владеть только один поток, что и обеспечивает синхронизацию. Для работы с критическими секциями есть ряд функций API и тип данных CRITICAL_SECTION. Для использования критической секции нужно создать переменную данного типа, и проинициализировать ее перед использованием с помощью функции InitializeCriticalSection(). Для того, чтобы войти в секцию нужно вызвать функцию EnterCriticalSection(), а после завершения работы LeaveCriticalSection(). Что будет, если поток обратится к секции, в которой сейчас другой поток ? Тот поток, который обратится будет блокирован пока критическая секция не будет освобождена. Саму критическую секцию можно удалить функцией DeleteCriticalSection(). Для того, чтобы обойти блокировку потока при обращении к занятой секции есть функция TryEnterCriticalSection(), которая позволяет проверить критическую секцию на занятость.

Для объявления начала критической секции используется функция.

VOID EnterCriticalSection

(

LPCRITICAL_SECTION lpCriticalSection

// указатель на переменную критическая секция

);

А для выхода из критической секции.

VOID LeaveCriticalSection

(

LPCRITICAL_SECTION lpCriticalSection

// указатель на переменную критическая секция

);

Для работы с критической секцией нам нужна переменная типа - критическай секция. Вот она:

CRITICAL_SECTION

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

VOID InitializeCriticalSection

(

LPCRITICAL_SECTION lpCriticalSection

// указатель на переменную критическая секция

);